Problem Description
给一个初始的入栈序列,其次序即为元素的入栈次序,栈顶元素可以随时出栈,每个元素只能入栈依次。输入一个入栈序列,后面依次输入多个序列,请判断这些序列是否为所给入栈序列合法的出栈序列。
例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个出栈序列,但4,3,5,1,2就不可能是该序列的出栈序列。假设压入栈的所有数字均不相等。
Input
第一行输入整数n(1<=n<=10000),表示序列的长度。
第二行输入n个整数,表示栈的压入顺序。
第三行输入整数t(1<=t<=10)。
后面依次输入t行,每行n个整数,表示要判断的每一个出栈序列。
Output
对应每个测试案例输出一行,如果由初始入栈序列可以得到该出栈序列,则输出yes,否则输出no。
Sample Input
5 1 2 3 4 5 2 4 5 3 2 1 4 3 5 1 2
题解:每一次将第i个数前的数压入栈,然后将栈顶元素出栈;判断一下第i个数与栈顶元素的大小,若不比栈顶元素大则出栈,否则压栈;
1 #include <iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<stack> 5 using namespace std; 6 int a[10010]; 7 int main() 8 { 9 int i,j,n,p,b,t,m; 10 stack<int>s; 11 scanf("%d",&n); 12 for(i=0; i<n; i++) 13 scanf("%d",&a[i]); 14 15 cin>>b; 16 for( m=0; m<b; m++) 17 { 18 int k=0,count2=0,count1=0; 19 while(!s.empty()) 20 { 21 s.pop(); 22 }//清空栈 23 for(j=0; j<n; j++) 24 { 25 scanf("%d",&p); 26 for(i=k; i<n; i++) 27 { 28 if(!s.empty())//空判断栈是否为非(易造成运行错误,若栈为空) 29 { 30 if(s.top()>=p) 31 break; 32 } 33 34 if(a[i]==p) 35 { 36 s.push(a[i]); 37 k=count2+1; 38 break; 39 } 40 else 41 { 42 s.push(a[i]); 43 count2++; 44 } 45 } 46 if(s.top()==p) 47 count1++; 48 s.pop(); 49 } 50 if(count1==n) 51 printf("yes "); 52 else 53 printf("no "); 54 } 55 return 0; 56 }