您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验之栈七:出栈序列判定

2017-07-28 16:16 232 查看

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


思路:很明显要使用栈,破题点就是“栈顶元素可以随时出栈”。用两个数组a.b存初始序列和每次的输出序列,用 i 遍历第一个数组,压入栈,当栈顶元素等于输出序列b【j】时,出栈,j++。遍历完a数组后,比较栈顶元素是否等于b【j】,相等执行j++并且出栈,不等便退出输出no

以下为完整代码
#include<bits/stdc++.h>
using namespace std;
#define STACK_INIT_SZIE 100//每次分配的空间个数
#define STACK_INCREMENT 10//每次追加的空间个数
#define OK 1;
#define ERROR 0;

typedef int ElemType;//决定栈的类型
typedef struct
{
ElemType *top;
ElemType *base;
int stacksize;
}mystack;

void Initialstack(mystack &s)//栈的初始化
{
s.base = (ElemType *)malloc(STACK_INIT_SZIE*sizeof(ElemType));
if(!s.base)
{
exit(OVERFLOW);
}
s.top = s.base;
s.stacksize = STACK_INIT_SZIE;
}

void Push(mystack &s, ElemType &e)//入栈
{
if(s.top - s.base == s.stacksize)//栈满
{
s.base = (ElemType *)realloc(s.base,(s.stacksize + STACK_INCREMENT)*sizeof(ElemType));
if(!s.base)
{
exit(OVERFLOW);
}
s.top = s.base + s.stacksize;
s.stacksize += STACK_INCREMENT;
}
*(s.top)++ = e;
}

int Pop(mystack &s)//出栈
{
if(s.top == s.base)//空栈
{
return ERROR;
}
else
s.top--;
return OK;
}

int Top(mystack &s, ElemType &e)//访问栈顶元素
{
if(s.top == s.base)//空栈
{
return ERROR;
}
else
e = *(--s.top);
s.top++;
return OK;
}

int main()
{
mystack s;
ElemType e;
int n,m,i,j,flag;
int a[10000], b[10000];
scanf("%d", &n);
for(i = 0;i < n; i++)
{
scanf("%d", &a[i]);
}
scanf("%d", &m);
while(m--)
{
flag = 1;
for(i = 0; i < n; i++)
{
scanf("%d", &b[i]);
}
for(i = 0, j = 0; i < n; i++)
{
Push(s,a[i]);
Top(s,e);
if(e==b[j])
{
j++;
Pop(s);
}
}
for(;j < n; j++)
{
Top(s,e);
if(e == b[j])
{
Pop(s);
}
else
{
flag = 0;
break;
}
}
if(flag)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: