出栈合法性 计蒜客 - T1565
问题描述
已知自然数 1, 2, …, N(1≤N≤100)依次入栈,请问序列 C1,C2,…,CN是否为合法的出栈序列。
输入格式
输入包含多组测试数据。
每组测试数据的第一行为整数 N(1≤N≤100),当 N=0 时,输入结束。
第二行为 NN 个正整数,以空格隔开,为出栈序列。
输出格式
对于每组输入,输出结果为一行字符串。
如给出的序列是合法的出栈序列,则输出"Yes",否则输出"No"。
样例输入
5
3 4 2 1 5
5
3 5 1 4 2
0
样例输出
Yes
No
- 参考程序
#include<iostream>
#include<algorithm>
using namespace std;
const int N=110;
int a[N], sta[N],head=0,pre=0;
int main(){
//freopen("data.in","r",stdin);
int n;
while(cin>>n){
if(n==0) break;
for(int i=1;i<=n;i++) cin>>a[i];
head=0,pre=1;
for(int i=1;i<=n;i++){
pre=max(pre,a[i-1]+1);//原本应该出现的元素
if(a[i]>pre){//升序入栈
for(int j=pre;j<a[i];j++){
sta[++head]=j;
}
}else if(a[i]==sta[head]){
--head;
}
}
if(head>0) cout<<"No\n";
else cout<< "Yes\n";
}
return 0;
}