P4387 【深基15.习9】验证栈序列
此题考查栈,本来很懵,觉得出栈情况很多,难道要一一列举对比
答案nonono
思路:
1、先把两个序列用数组存储下来
2、入栈的同时进行判断
(1)栈非空且栈顶元素和poped指定g位置的元素相同,出栈,g++
(2)否则继续入栈
3、如果出栈序列合法,那么g应该和n相同,依次决定输出内容
#include<bits/stdc++.h>
using namespace std;
//暂时存储两个序列
int q,n,x,pushed[100005]={0},poped[100005]={0};
int main(){
cin>>q;
for(int i=0;i<q;i++){
cin>>n;
// 现将两个序列存到数组中
for(int j=0;j<n;j++) cin>>pushed[j];
for(int k=0;k<n;k++) cin>>poped[k];
stack<int> st;
int g=0;
for(int z=0;z<n;z++){
st.push(pushed[z]);
// 栈顶元素和poped数组进行匹配,成功则出栈、且g++,因为要和下一个进行匹配;
// 匹配不成功则继续入栈
while(!st.empty()&&st.top()==poped[g]){//判栈空条件不能删除,例如入栈123,出栈321
st.pop();
g++;
}
}
if(g==n) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}

浙公网安备 33010602011771号