SDUT 3334 栈与队列:出栈序列判定 栈混洗
2015-10-09 17:09
197 查看
数据结构实验之栈七:出栈序列判定
Time Limit: 30MS Memory limit: 1000K
题目描述
给一个初始的入栈序列,其次序即为元素的入栈次序,栈顶元素可以随时出栈,每个元素只能入栈依次。输入一个入栈序列,后面依次输入多个序列,请判断这些序列是否为所给入栈序列合法的出栈序列。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个出栈序列,但4,3,5,1,2就不可能是该序列的出栈序列。假设压入栈的所有数字均不相等。
输入
第一行输入整数n(1<=n<=10000),表示序列的长度。第二行输入n个整数,表示栈的压入顺序。
第三行输入整数t(1<=t<=10)。
后面依次输入t行,每行n个整数,表示要判断的每一个出栈序列。
输出
对应每个测试案例输出一行,如果由初始入栈序列可以得到该出栈序列,则输出yes,否则输出no。示例输入
51 2 3 4 524 5 3 2 14 3 5 1 2
示例输出
yesno
提示
来源
示例程序
提#include<bits/stdc++.h> //栈混洗只允许让一个序列借助中间栈(只能借助一次),让其形成另外一个序列 using namespace std; stack<int>Q,P,QQ; int main() { int T,n,m,t; scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d",&t); Q.push(t); //逆存 } while(!Q.empty()) //反正 { QQ.push(Q.top()); Q.pop(); } scanf("%d",&m); while(m--) { Q=QQ; //原序列 int i=0,c,flag=0; for(int i=0; i<n; i++) { scanf("%d",&t); if(flag) continue; if(P.empty()) { if(Q.empty()) { flag=1; continue; } P.push(Q.top()); Q.pop(); } while(!P.empty()) { c=P.top(); //通过判断中间栈的栈顶元素 if(c==t) { P.pop(); break; } else { if(Q.empty()) { flag=1; break; } P.push(Q.top()); Q.pop(); } } } if(flag) printf("no\n"); else printf("yes\n"); } }
相关文章推荐
- 各笔试面试题
- MongoEngine 中文文档 系列教程 User Guide( 五)
- MongoEngine 中文文档 系列教程 User Guide( 四)
- 组合数 题解
- Universal Image Loader 笔记
- 文章标题
- 使用了过滤条件的 ArrayAdapter,向源数据添加或删除数据后刷新时,界面不会同步更新
- MongoEngine 中文文档 系列教程 User Guide( 三)
- Eclipse使用小技巧
- 需求工程-软件建模与分析读书笔记1
- mysql常用命令总结
- 第一例:HelloWorld
- String源码解读之Resource接口
- fragment replace时的状态保存
- 求解算法的时间复杂度
- iOS开发---百度地图配置流程,2.6.0 版本 支持64位
- 【转+修改】什么是Mbps、Kbps、bps、kb、mb及其换算和区别
- MongoEngine 中文文档 系列教程 User Guide( 二)
- stvd watch 实时变量查看
- C#操作数据库中存取图片文件的方法