已知自然数1,2,...,N(1≤N≤10000)依次入栈(即a<b当且仅当a先于b入栈),问:序列C1,C2,...,CN是否为可能的出栈序列。
例如:N=5时,3,4,2,1,5是一个可能的出栈序列,因为其可以按如下操作获得:push 1,push 2,push 3,pop,push 4,pop,pop,pop,push 5,pop
Input
输入数据包含若干组测试样例。
每组测试样例的第一行为整数N(1≤N≤10000);
第二行为N个正整数,以空格隔开,为出栈序列;
输入数据的末尾以一个0表示输入的结束。
Output
对于每组测试样例,输出结果为一行字符串。
如给出的序列是可能的出栈序列,则输出"Yes",否则输出"No"。
注意:区分大小写,引号本身不输出。
Sample Input
5 3 4 2 1 5 5 3 5 1 4 2 0
Sample Output
Yes No
#include<iostream> #include<cstdio> #include<stack> #include<stdio.h> using namespace std; int main() { stack<int> s; int a[10000]={0}; int n,flag,i,j,top; while(1) { scanf("%d",&n); for(i=0;i<=n-1;++i) scanf("%d",&a[i]); if(n==0) return 0; flag=1; for(i=1;i<=a[0];++i) s.push(i); s.pop(); for(j=1;j<=n-1;++j) { if(a[j]>a[j-1]) for(i=a[j-1]+1;i<=a[j];++i) { s.push(i); s.pop(); } else { top=s.top(); if(top==a[j]) s.pop(); else { flag=0; break; } } } if(flag==1) printf("Yes "); else printf("No "); } return 0; }
第二种方法
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <math.h> #include <stack> using namespace std; int main() { int N; while(scanf("%d",&N)!=EOF&&N) { stack <int> s1,s3; int s2[15000]; int d=2,i,flag=0; for(i=1;i<=N;i++) scanf("%d",&s2[i]); for(i=N;i>=1;i--) s1.push(s2[i]); s3.push(1); while(1) { if(s3.top()==s1.top()) { s1.pop(); s3.pop(); } if(s1.empty()&&s3.empty()) { flag=1; break; } if(s3.empty()) s3.push(d++); else if(s3.top()!=s1.top()) s3.push(d++); if(d==N+2) break; } if(flag) printf("Yes "); else printf("No "); } }