【深基15.习9】验证栈序列
题目描述
给出两个序列 pushed 和 poped 两个序列,其取值从 1 到
n
(
n
≤
100000
)
n(n\le100000)
n(n≤100000)。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes
,否则输出 No
。为了防止骗分,每个测试点有多组数据。
输入格式
第一行一个整数 q q q,询问次数。
接下来 q q q 个询问,对于每个询问:
第一行一个整数 n n n 表示序列长度;
第二行 n n n 个整数表示入栈序列;
第三行 n n n 个整数表示出栈序列;
输出格式
对于每个询问输出答案。
样例 #1
样例输入 #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
解题思路:
错解:我一看题目,wow!好简单,这样的题目居然还算在“普及提高”里,当提交的后出现的一片红让我知道还是我太草率、太心急了。我以为样例入栈顺序就是简单的1 ~ 5依次一次性入栈,所以出栈顺序理所应当也就是5 ~ 1咯。非也!!!
正解:如图所示,当出栈顺序为1 3 2 5 4时,它的入栈顺序任是1 2 3 4 5
这便是出栈序列的合法性(满足“先进后出”)。
可参考:出栈序列的合法性
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int stk[N],a[N],b[N];
int k, n, tt, x;
int main()
{
cin >> k;
while(k -- )
{
cin >> n;
for(int i = 0; i < n; i ++)
cin >> a[i];
for(int i = 0; i < n; i ++)
cin >> b[i];
int j = 0;
for(int i = 0; i < n; i ++)
{
stk[++ tt] = a[i]; //入栈
while(tt > 0 && b[j] == stk[tt]) ///当栈顶元素与b中当前元素相同时出栈
{
tt --;
j ++;
if(tt <= 0) break; ///注意这里,当栈空时还用了出栈操作会re,所以要手动结束循环
}
}
cout << (tt <= 0 ? "Yes":"No") << endl;
while(tt > 0) tt --;
}
return 0;
}
练习:
栈和排序