给定一个从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
4
1 4 2 3
Sample Output
Yes
No
方法一:
先定义栈,每次使用前清空。
因为是多组输入,每次使用前不要忘记清空栈!!
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
int main()
{
stack<int>s;
int n,i,a[100];
while(cin>>n)
{
for(i=0;i<n;i++)
cin>>a[i];
while(!s.empty())
s.pop(); //清空栈
int t=0,x=1;
for(i=0;i<n;i++)
{
if(s.empty())
s.push(++t);
while(s.top()<a[i])
s.push(++t);
if(s.top()==a[i])
s.pop();
else if(s.top()>a[i])
{
x=0;
break;
}
}
if(x==1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
方法二:
每次使用时都定义栈,但如果数据太大,这样有可能会内存超限。
不建议这种方法!!
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
int main()
{
int n,i,a[100];
while(cin>>n)
{
for(i=0;i<n;i++)
cin>>a[i];
stack<int>s; //使用时随用随定义
int t=0,x=1;
for(i=0;i<n;i++)
{
if(s.empty())
s.push(++t);
while(s.top()<a[i])
s.push(++t);
if(s.top()==a[i])
s.pop();
else if(s.top()>a[i])
{
x=0;
break;
}
}
if(x==1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}