数据结构实验之栈七:出栈序列判定
Time Limit: 30MS Memory Limit: 1000KB
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
51 2 3 4 524 5 3 2 14 3 5 1 2
Example Output
yesno
Hint
这个题最想吐槽的是开数组输入的时候,数组大小是10000,而我开的1000,但是提交后结果是Time Limit Error,而不是RunTime Error,所以一直再找程序中的算法是否出现了问题,当反复查了无数遍后才发现只有数组大小那一个地方不同。所以定义数组一定要看好范围!!!!!
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define maxsize 1000
int a[10001],b[10001];//定义数组,范围一定不要小了
int n,num;
typedef struct
{
int *top;
int *base;
int stacksize;
}qstack;
//初始化栈
void Initstack(qstack &s)
{
s.base=(int *)malloc(maxsize*sizeof(int));
s.top=s.base;
s.stacksize=maxsize;
}
//进栈判断
void CK1stack(qstack &s,int a[],int b[])
{
int i=0;
int j=0;
while(i<n)
{
if(a[i]==b[j])//相同则向后移位
{
i++;
j++;
}
else//不同则进栈
{
*(++s.top)=a[i];
i++;
}
}
num=j;
}
//出站判断
void CK2stack(qstack &s,int b[])
{
//int num=j;
int flag=1;
while(s.top!=s.base)//由栈顶开始判断当前元素是否相同
{
if(*(s.top)==b[num])
{
num++;
s.top--;
}
else
{
flag=0;
printf("no\n");
return ;
}
}
if(flag)
{
printf("yes\n");
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int t;
scanf("%d",&t);
while(t--)
{
num=0;
qstack s;
Initstack(s);//记得每次都要初始化
for(int i=0;i<n;i++)
{
scanf("%d",&b[i]);
}
int j;
CK1stack(s,a,b);
CK2stack(s,b);
}
return 0;
}