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
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define STACKINITSIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -1
#define OK 1
typedef int SElemType ;
typedef int Statu ;
typedef struct node
{
SElemType * base;
SElemType * top;
int stacksize;
} SqStack;
Statu Judge(int a[], int n);
Statu InitList(SqStack &S);
Statu Push(SqStack &S, SElemType e); //进栈
Statu Pop(SqStack &S, SElemType &e); // 出栈
Statu GetTop(SqStack S, SElemType e); //取元素
int main()
{
int n, i;
int a[10010];
scanf("%d", &n);
for(i = 0; i< n; i++)
{
scanf("%d", &a[i]);
}
scanf("%d", &i);
while(i--)
Judge(a, n);
return 0;
}
Statu InitStack(SqStack &S)
{
S.base =(SElemType *)malloc(STACKINITSIZE*sizeof(SElemType));
if(!S.base)
exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACKINITSIZE;
return OK;
}
Statu Push(SqStack &S, SElemType e)
{
if(S.top - S.base >= S.stacksize)
{
S.base =(SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(SElemType));
if(!S.base)
exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
* S.top++ = e;
return OK;
}
Statu Pop(SqStack &S, SElemType &e)
{
if(S.top == S.base)
return -1;
e = * --S.top;
return OK;
}
Statu Judge(int a[], int n)
{
int i, j, k, b[10010];
SqStack S;
InitStack (S);
scanf("%d", &j);
for(i = 0; i < n; i++)
{
if(j != a[i])
Push(S, a[i]);
else
break;
}
k = i;
for(i = 0; i < n - 1; i++)
scanf("%d", &b[i]);
for(i = 0; i < n - 1; i++)
{
if(b[i] == *(S.top - 1))
{
Pop(S, j);
}
else
{
int x;
int y = k;
for(k = k; k < n; k++)
{
if(b[i] == a[k])
{
x = k;
break;
}
}
if(k == n)
break;
else
{
k = x;
for(int t = y + 1; t < x; t++)
Push(S, a[t]);
}
}
}
if(S.top == S.base)
printf("yes\n");
else
printf("no\n");
return OK;
}