P4387 【深基15.习9】验证栈序列
题目描述
给出两个序列 pushed 和 poped 两个序列,其取值从 1 到 n(n≤100000)。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes
,否则输出 No
。为了防止骗分,每个测试点有多组数据。
输入格式
第一行一个整数 q,询问次数。
接下来 q 个询问,对于每个询问:
第一行一个整数 n 表示序列长度;
第二行 n 个整数表示入栈序列;
第三行 n 个整数表示出栈序列;
输出格式
对于每个询问输出答案。
输入输出样例
输入 #1
2 5 1 2 3 4 5 5 4 3 2 1 4 1 2 3 4 2 4 1 3
输出 #1
Yes No
题解
首先按要求输入询问次数q。然后在q次循环(用while循环)中每次询问的序列长度、入栈序列a和出闸序列b。再在while中用一次for循环,将a[i]入栈,当栈顶元素等于b[0]时,出栈,将x加一,
如果栈为空,则跳出这次for循环。当一遍for循环结束后,如果栈为空,则输出YES,否则输出NO。当栈非空,则出栈。
代码
#include <iostream> #include <stack> using namespace std; stack<int> p; int main() { int q,n,i; cin>>q; while(q--) { cin>>n; int a[n],b[n],x=0; for(i=0;i<n;i++) { cin>>a[i]; } for(i=0;i<n;i++) { cin>>b[i];, } for(i=0;i<n;i++) { p.push(a[i]); while(p.top()==b[x]) { p.pop(); x++; if(p.empty()) break; } } if(p.empty()) cout<<"Yes"<<endl; else cout<<"No"<<endl; while(!p.empty()) p.pop(); } return 0; }