数据结构实验之栈七:出栈序列判定
Time Limit: 30MS Memory Limit: 1000KB
Problem Description
给一个初始的入栈序列,其次序即为元素的入栈次序,栈顶元素可以随时出栈,每个元素只能入栈依次。输入一个入栈序列,后面依次输入多个序列,请判断这些序列是否为所给入栈序列合法的出栈序列。
例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个出栈序列,但4,3,5,1,2就不可能是该序列的出栈序列。假设压入栈的所有数字均不相等。
Input
第一行输入整数n(1<=n<=10000),表示序列的长度。
第二行输入n个整数,表示栈的压入顺序。
第三行输入整数t(1<=t<=10)。
后面依次输入t行,每行n个整数,表示要判断的每一个出栈序列。
Output
对应每个测试案例输出一行,如果由初始入栈序列可以得到该出栈序列,则输出yes,否则输出no。
Example Input
5
1 2 3 4 5
2
4 5 3 2 1
4 3 5 1 2
Example Output
yes
no
Hint
思路:用栈,按照出栈序列模拟即可。1.所给的序列,从第一个元素开始查看是不是出栈的元素,如果不是就一直压入栈,否则出栈。重复这个过程。
如果所给的序列全压进去也找不到出栈的元素表示这个出栈过程是不可能实现的。
如果出栈的序列可以全部完成表示就是可以的。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e4+5;
int a[MAXN],st[MAXN],b[MAXN];
int main()
{
int i,j;
int n,t;
scanf("%d",&n);
for(i=0;i<n;++i)scanf("%d",&a[i]);
scanf("%d",&t);
while(t--)
{
for(i=0;i<n;++i)scanf("%d",&b[i]);
int top=0,cnt=0;
st[top++]=a[cnt++];
for(i=0;i<n;++i)
{
while(st[top-1]!=b[i]&&cnt<n)st[top++]=a[cnt++];//如果栈顶元素和出栈的元素不相等
if(st[top-1]!=b[i])//全都压进去了还是找不到
{
puts("no");
break;
}
else//否则出栈
{
--top;
}
}
if(i==n)puts("yes");//可以完成
}
return 0;
}
/***************************************************
Result: Accepted
Take time: 12ms
Take Memory: 268KB
Submit time: 2016-09-19 16:40:15
****************************************************/