题目描述
有顺序排列的1,2, 3,…,n节车厢在入站口等待调度。车站设置了一个栈作为缓冲,这样的话只可能进行下列两个操作之一:
(1)如果还有车厢在入站口,将最前面的入栈缓冲
(2)将栈顶的车厢驶出车站
给定一个1至n的排列,问其作为出站序列是否合法。
注意:入站顺序为1,2, 3,…,n,即1先入栈...,n最后入栈。
输入
输入包含若干测试用例。每一个测试用例由多行组成。第一行是两个整数n(1<=n <= 100)和m,n表示入站序列为1至n。m表示随后有m行出站序列。
当n,m均为0时表示输入结束。
输出
对应每一个出站序列,合法则输出一行YES,否则输出一行NO。
样例输入
3 6
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
0 0
样例输出
YES
YES
YES
YES
NO
YES
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define OK 1
#define OVERFLOW -2
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef int SElemType;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S) {
S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base) return OVERFLOW;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
/*Status DestroyStack(SqStack &S) {
SElemType *p;
if(S.base) {
for(p=--S.top;p>S.base;p--)
free(p);
free(S.base);
}
return OK;
}
Status ClearStack(SqStack &S) {
if(!S.base) return ERROR;
S.top=S.base;
return OK;
}*/
Status StackEmpty(SqStack S) {
if(S.top==S.base) return TRUE;
else return FALSE;
}
Status GetTop(SqStack S,SElemType &e) {
if(!S.base) return ERROR;
e=*(S.top-1);
return e;
}
Status Push(SqStack &S,SElemType e) {
if(!S.base) return ERROR;
if(S.top-S.base>=S.stacksize) {
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base) return OVERFLOW;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
Status Pop(SqStack &S,SElemType &e) {
if(S.top==S.base) return ERROR;
e=*(--S.top);
return OK;
}
/* check the stack out seqence is valid or not
*
* Return value:
* >0 : valid
* =0 : invalid
* <0 : error occured
*/
int check_valid (char in[], char out[], int length)
{
int i=0, j=0;
SElemType e;
SqStack s;
//InitStack(Sqstack s); // 这样的错误不应该!
InitStack(s);
if (in==NULL || out==NULL || length <=0)
return -1;
for (i=0; i<length; i++)
{
Push(s,in[i]);
while (!StackEmpty(s) && GetTop(s,e)==out[j]) {
Pop(s,e);
j++;
}
}
if (StackEmpty(s))
return 1;
return 0;
}
int main (int argc, char *argv[])
{
int n,m;
int i;
char in[101],out[101];
printf("请输入序列的元素个数以及出栈的组数:");//中间用空格隔开
scanf("%d %d", &n, &m);
printf("请输入原始序列:");
scanf("%s",&in);//输入方式修改成这样
/*for(i=1;i<=n;i++)
{
in[i-1]=i;//输入序列
}*/
printf("请输入可能的出栈顺序:\n");
while(n!=0 && m!=0)
{
for(i=1;i<=m;i++)
{
scanf("%s",out);
if( check_valid(in,out,n)>0)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}