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。
Example Input
5 1 2 3 4 5 2 4 5 3 2 1 4 3 5 1 2
Example Output
yes no
Hint
Author
#include <stdio.h> #include <stdlib.h> #define stackmax 10000 #define stacknum 10 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 typedef int selemtype; typedef int status; typedef struct { selemtype *base; selemtype *top; int stacksize; } sqstack; int Inistack(sqstack &S) { S.base=(selemtype *)malloc(stackmax * sizeof(selemtype)); if(!S.base) exit(OVERFLOW); S.top=S.base; S.stacksize=stackmax; return OK; } int push(sqstack &S,selemtype e) { if(S.top-S.base>=S.stacksize) { S.base=(selemtype *)realloc(S.base,(S.stacksize+stacknum)*sizeof(selemtype)); if(!S.base) exit(OVERFLOW); S.top=S.base+S.stacksize; S.stacksize+=stacknum; } *(S.top)=e; S.top++; return OK; } int pop(sqstack &S, selemtype &e) { if(S.top==S.base) return ERROR; e=*--S.top; return OK; } status isempty(sqstack S) { if(S.top==S.base) return TRUE; else return FALSE; } int clear(sqstack &S) { S.top=S.base; return 1; } int a[100100],b[100100]; int main() { sqstack S; Inistack(S); int n,t,i,flag,m,r; selemtype e; scanf("%d",&n); for(i=0; i<n; i++) { scanf("%d",&a[i]); } scanf("%d",&t); while(t--) { clear(S); flag=1; for(i=0; i<n; i++) { scanf("%d",&b[i]); } m=r=0; while(m<n) { if(a[m]==b[r]) { m++; r++; } else { push(S,a[m]); m++; } } while(!isempty(S)) { pop(S,e); if(b[r]==e) { r++; } else { flag=0; break; } } if(flag) printf("yes\n"); else printf("no\n"); } return 0; }