数据结构实验之栈与队列七:出栈序列判定
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
Output
yes no
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,top,n,t; 5 int a[10005]; 6 int b[10005]; 7 int zhan[10005]; 8 scanf("%d",&n); 9 for(i=0;i<n;i++) 10 { 11 scanf("%d",&a[i]); 12 } 13 scanf("%d",&t); 14 while(t--) 15 { 16 for(j=0;j<n;j++) 17 { 18 scanf("%d",&b[j]); 19 } 20 i=0; 21 j=0; 22 top=-1; 23 while(j<n) //看按照b[]中的n個元素的序列是否都能出棧 24 { 25 if(a[i]==b[j]) 26 { //說明要出棧的b[i]中的元素與a[]中某元素相等,可以出棧,元素後移判斷下一個。 27 i++; 28 j++; 29 } 30 else if(top!=-1&&zhan[top]==b[j]) //如果棧不空,並且此時棧頂元素等於b[]中要出棧的元素 31 { 32 j++; 33 top--; //滿足條件,b[j]即可出棧,即j後移一位判斷下一個。同時棧頂元素下標減一。 34 } 35 else if(i<n) 36 { 37 zhan[++top]=a[i];//將上一步a[i]!=b[j]的a[i]元素進棧 38 i++; 39 } 40 else 41 break; 42 } 43 if(top==-1) //判斷棧內元素是否爲空 44 { 45 printf("yes "); 46 } 47 else 48 { 49 printf("no "); 50 } 51 } 52 return 0; 53 }