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;
		}
	}

posted @ 2025-03-27 19:26  夕瑶^  阅读(40)  评论(0)    收藏  举报