SDUT 3334 数据结构实验之栈与队列七:出栈序列判定
2018-03-12 15:03
375 查看
栈 :出栈顺序判断
题目
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
代码&分析
核心可以说就是一个栈,设置两个标志i,j分别从两个序列开始走,如果两者的值一致,这种情况对应的是入栈一个,出栈一个,如果不相等,那么有可能是先入栈了几个元素,然后才开始出出栈的,所以先保存再栈里,一直到栈顶元素等于要判断的序列的j位置元素为止,这时候模拟出栈,继续上述的循环即可。#include<stdio.h> #include<stack> #include<iostream> int a[10005]; //初始的进栈顺序 int b[10005]; //判断的每组输入 using namespace std; int main(){ int n; int t; cin>>n; for(int i=0 ;i<n; i++) cin>>a[i]; cin>>t; while(t--){ for(int i=0; i<n; i++) cin>>b[i]; stack<int> c; int i=0; //从同开始比较 int j=0; while(j<n){ if(a[i]==b[j]){ //这种情况下,对应a进栈一个,出栈一个,这样a,b的顺序才一样 i++; j++; } else if(!c.empty() && c.top()==b[j]){ //如果a[i],b[j]不同,说明可能是先进栈多个数,然后才开始出栈 c.pop(); //判断c的顶元素与b[j]是否相同 j++; } else if(i<n){ //对于a[i],b[j]不同的时候,先把a[i]入栈保存 c.push(a[i]); i++; } else{ break; } } if(c.empty()) //最后如果c为空,则说明都已经比较完成,也就是可以按照b的顺序出栈 cout<<"yes"<<endl; else cout<<"no"<<endl; } }
相关文章推荐
- SDUT 3334 数据结构实验之栈与队列七:出栈序列判定
- 3334 数据结构实验之栈与队列七:出栈序列判定
- 3334-数据结构实验之栈与队列七:出栈序列判定
- 数据结构实验之栈与队列七:出栈序列判定
- SDUT 3334 栈与队列:出栈序列判定 栈混洗
- SDUT 2135 数据结构实验之队列一:排队买饭
- SDUT 出栈序列判定 3334
- sdut 1479 数据结构实验之栈与队列九:行编辑器
- SDUT 1519 数据结构实验之链表八:Farey序列
- SDUT 2135 数据结构实验之队列一:排队买饭
- sdut 3333 数据结构实验之栈与队列六:下一较大值(二)
- sdut 3334 数据结构实验之栈七:出栈序列判定
- SDUT 2131 数据结构实验之栈与队列一:进制转换
- sdut 2088 数据结构实验之栈与队列十一:refresh的停车场
- sdut 2135 数据结构实验之队列一:排队买饭
- SDUT 3333 数据结构实验之栈与队列六:下一较大值(二)
- sdut 数据结构实验之队列一:排队买饭
- 栈与队列-出栈序列统计(数据结构基础 第3周)
- 【单调栈】SDUT 3333 数据结构实验之栈与队列六:下一较大值(二)
- SDUT_2449_数据结构实验之栈与队列十:走迷宫