出栈序列(栈和队列)
Description
已知自然数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
Hint
1 #include<stdio.h> 2 #include<iostream> 3 #include<stack> 4 using namespace std; 5 int main() 6 { 7 int n,a[10000],i,j,flag; 8 while(scanf("%d",&n)!=EOF) 9 { 10 if(n==0) 11 break; 12 stack<int>s; 13 flag=1; 14 for(i=0; i<n; i++) 15 { 16 scanf("%d",&a[i]); 17 } 18 for(i=1; i<a[0]; i++) 19 { 20 s.push(i); 21 }///搞定第一个数 22 for(j=1; j<n; j++) 23 { 24 if(a[j]>a[j-1])///后面的数大于前面的数 25 { 26 for(i=a[j-1]; i<=a[j]; i++) 27 { 28 s.push(i); 29 s.pop(); 30 } 31 } 32 else 33 { 34 35 if(s.top()==a[j]) 36 { 37 s.pop(); 38 } 39 else 40 { 41 flag=0; 42 break; 43 } 44 } 45 } 46 if(flag==1) 47 printf("Yes\n"); 48 else 49 printf("No\n"); 50 } 51 return 0; 52 }