有顺序排列的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 <stdio.h>
#include <malloc.h>
typedef int SElemType;
typedef int Status;
#define INIT_SIZE 100
#define STACKINCREMENT 100
#define Ok 1
#define Error 0
#define True 1
#define False 0
int A[3000];
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//初始化栈
Status InitStack(SqStack *s)
{
s->base = (SElemType *)malloc(INIT_SIZE * sizeof(SElemType));
if(!s->base)
{
puts(“存储空间分配失败!”);
return Error;
}
s->top = s->base;
s->stacksize = INIT_SIZE;
return Ok;
}
//清空栈
Status ClearStack(SqStack *s)
{
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->top == s->base) return Error;
e = *(s->top – 1);
return Ok;
}
//压栈
Status 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)
{
puts(“存储空间分配失败!”);
return Error;
}
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;
–s->top;
*e = *(s->top);
return Ok;
}
int Judge(int n)
{
SqStack a;
SqStack *s = &a;
SElemType e;
InitStack(s);
int i;
int need;
need=n;
for(i=n;i>=1;i–)
{
if(A[i]==need)
{
need=need-1;
while(!StackEmpty(s)&&GetTop(s,e)==need)
{
Pop(s,&e);
need=need-1;
}
continue;
}
if(StackEmpty(s))
Push(s,A[i]);
else
{
if(GetTop(s,e)>A[i])//判断栈顶元素能否比当前最后一辆序列大
return 0;
else
Push(s,A[i]);
}
}
return 1;
}
int main(void)
{
int n,m;
while(scanf(“%d %d”,&n,&m)&&(n||m))
{
for(int k=0;k<m;k++)
{
for(int i=1;i<=n;i++)
scanf(“%d”,&A[i]);
printf(“%s\n”,Judge(n)?”YES”:”NO”);
}
}
}
运行的时候,输入3 1 2显示的是YES,而正确答案是NO。是不是本人加注释的那一步错了?讨教出错的地方。
80
提醒:再牛×的老师也无法代替学生本人领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。