有关栈的应用

C语言 码拜 9年前 (2016-04-06) 1049次浏览
题目描述
有顺序排列的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执行停在该断点处。)是程序员必须掌握的技能之一。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明有关栈的应用
喜欢 (0)
[1034331897@qq.com]
分享 (0)