#include <stdio.h>
#include <stdlib.h>
/*弹出序列算法的思路:
依次将压入数组的元素压入栈中,每压一个元素,和弹出数组进行比较
top–
while循环判断,如果相同,弹出
如果不想同,top++,继续压入
*/
/栈的结构体/
typedef struct Stack{
int len;
int top;
int
*space;
}Stack;
/栈的初始化/
void initStack(Stack *s,int len)
{
s->len = len;
s->top = 0;
s->space = (int *)malloc(sizeof(int)*len);
}
/入栈/
void pushStack(Stack *s,int data)
{
s->space[s->top++]= data;
}
/出栈/
int popStack(Stack *s)
{
return s->space[–s->top];
}
/判空/
/判断栈是否为空/
int isStatckEmpty(Stack *s)
{
return s->top == 0;
}
int main(void)
{
Stack stack;
int instack[5]={0};
int output[5]={0};
int data;
int i,j=0,num;/num:序列个数 data:数据/
while(scanf("%d",&num) != EOF)
{
/*键盘输入,得到压入序列*/
printf("stack \n");
for(i=0;i<num;i++)
{
scanf("%d",&data);
instack[i] = data;
}
/*键盘输入,得到弹出序列*/
printf("output \n");
for(i=0;i<num;i++)
{
scanf("%d",&data);
output[i] = data;
}
/*栈的初始化*/
initStack(&stack,num);
for(i=0;i<num;i++)
{
/*入栈*/
pushStack(&stack,instack[i]);
stack.top--; /*最关键的步骤*/
while(stack.space[stack.top] == output[j])
{
/*出栈*/
popStack(&stack);
j++;
}
stack.top++; /*最关键的步骤*/
}
if(isStatckEmpty(&stack)==1)
printf("YES \n");
else
printf("NO \n");
}
return 0;
}