题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1182
题目描述:
给定一个从1开始的连续整数列1、2、3、4......n。
将上述数列按顺序入栈,中途栈顶元素可以出栈。
再给定一个出栈序列,判断此序列是否合法。
例如,将n设为4。即得到数列1、2、3、4。
再给定出栈序列1、3、4、2。
可以看出,此出栈序列合法。
过程如下,先将数列1、2、3、4中的元素1入栈,再将其出栈。
然后将元素2、3入栈,将元素3出栈。
最后将元素4入栈,再把栈内的仅余元素4、2出栈。
整个过程中,元素按照1、3、4、2的顺序出栈。证明其合法。
Input
输入包括多组测试用例。
对于每组测试用例,第一行包含一个整数n<100,代表从1开始的连续整数列长度。
第二行包含一个长度为n的数列,代表出栈序列。出栈序列的各元素在区间[1,n]内且不重复。
Output
若出栈序列合法,则输出Yes。
否则,输出No。
Sample Input
4
1 3 4 2
Sample Output
Yes
思路分析:
1.这里面用栈与队列解决这个问题,定义一个栈z与队列q解决这个问题。
2.首先需要把这个要判断的序列全部放入队列中,下面按照1-n的顺序,依次把这些数压栈。
3.每把一个数压栈后,这时候判断栈是否为空(不能判断队列)和栈顶元素是否和队头元素是否相等, 若这两个数相等,则栈顶与队头元素都出栈和队列。
4.等上一步都判断完,这时候判断一下队列或者栈元素是否为空即可(栈和队列选一个就可)
代码:
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
int main()
{
int i,n,a[101];
while(cin>>n)
{
stack<int> z;
queue<int> q;//栈与队列定义要在while内部,想想为什么
for(i=1;i<=n;i++)
{
cin>>a[i];
q.push(a[i]);
}
for(i=1;i<=n;i++)
{
z.push(i);
while(z.empty()==0&&z.top()==q.front())
{
z.pop();
q.pop();
}
}
if(z.empty()==1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
样例讲解:
1.假如要判断的的序列长度为4,序列值为1 3 2 4,首先把这个序列入队,这时候队列从头到尾的顺序为1 3 2 4
2.开始从1-n一 一判断,首先1入栈,这时候栈顶元素和队头元素想等,进行出队和出战操作,这时候栈空了,结束while循环,队头元素为3.
3.这时候把2入栈,不满足条件,不进行出栈和出队操作,继续把3入栈,这时候满足条件,进行出栈和出队操作,3出栈后,栈中还有2,继续进行判断,这时候有满足条件,继续出栈。
4.4进行入栈,这个情况和1一样。1-n判断完了,而且栈为空,所以这个序列满足条件。