数据结构实验之栈与队列七:出栈序列判定
Time Limit: 30 ms Memory Limit: 1000 KiB
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。
Sample Input
5
1 2 3 4 5
2
4 5 3 2 1
4 3 5 1 2
Sample Output
yes
no
Hint
Source
THINK:
模拟入栈和出栈,先把数都存到一个数组里面,输入要出栈的数,与当前的栈顶元素比较,如果不相等说明当前的元素不要出栈,那就继续把数组里面的数入栈,如果遇到相等的了,就说明这个数刚入栈就要出栈,那就出栈;最后看看栈里面还剩不剩元素,输出yes或者no
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[10001],b[10001];
int main()
{
int n,m;
scanf("%d",&n);
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
while(m--)
{
int top=0,p=1;
for(int i=1;i<=n;i++)
{
int k;
scanf("%d",&k);
while(b[top]!=k||top==0)
{
if(p>n)break;
b[++top]=a[p++];
}
if(b[top]==k)top--;
}
if(top==0)printf("yes\n");
else printf("no\n");
}
return 0;
}
-
#include <bits/stdc++.h> using namespace std; int a[10010], b[10010];//原序列,新序列 int main() { int n, k; cin >> n; for(int i = 0; i < n; i++) { scanf("%d", &a[i]); } cin >> k; while(k --) { for(int i = 0; i < n; i++) { scanf("%d", &b[i]); } stack<int>S;//中间栈 int i = 0, j = 0; while(j < n) { if(a[i] == b[j]) { j++; i++; } else if(!S.empty() && S.top() == b[j])//取栈顶元素和当前元素想比,若相等,将栈顶元素出栈 { j++;//新序列元素更新 S.pop(); } else if(i < n) { S.push(a[i]);//原序列入栈 i ++; } else break; } if(S.empty())//若中间栈为空,则此序列合法 { cout << "yes" << endl; } else//否则不合法 { cout << "no" << endl; } } return 0; }
假设原序列为12345,新序列为54321; 假设原序列为12345,新序列为43512;
原序列全部入栈; 前面几项均不匹配
栈中元素:12345,栈顶元素5,新序列元素5; 则1234入栈,栈中元素:1234,栈顶元素4,新序列元素4
栈中元素:1234,栈顶元素4,新序列元素4; 栈中元素:123,栈顶元素3,新序列元素3
栈中元素:123,栈顶元素3,新序列元素3; 栈中元素:125,栈顶元素5,新序列元素5
栈中元素:12,栈顶元素2,新序列元素2; 栈中元素:12,栈顶元素2,新序列元素1
栈中元素:1,栈顶元素1,新序列元素1; 此时,i不再满足条件,跳出循环
栈空 栈不空
扫描二维码关注公众号,回复: 2573621 查看本文章