出栈合法性 计蒜客 - 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;
}










