标题:[求助] 帮查看一下栈的操作为什么会出错?初级版
只看楼主
C_ray
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2005-12-17
 问题点数:0 回复次数:3 
[求助] 帮查看一下栈的操作为什么会出错?初级版

运行输出时,好象出现了越界的一个值。(经其他原码改编)
怎么会。。。



#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 10
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define SIZE 5

typedef char SElemType;
typedef int Status;
typedef struct STACK /*define a stack*/
{
Status *base;
Status *top;
int stacksize;
int length;
}SqStack,*Stack;

void InitStack(Stack *S) /*give value*/
{
*S=(SqStack *)malloc(sizeof(SqStack));
(*S)->base=( Status *)malloc(STACK_INIT_SIZE*sizeof(Status));
if(!(*S)->base)
exit(-1);
(*S)->top=(*S)->base;
(*S)->stacksize=STACK_INIT_SIZE;
(*S)->length=0;
}
Status DestroyStack(Stack *S) /* destroy stack*/
{
free((*S)->base);
free((*S));
return OK;
}
void ClearStack(Stack *S) /*make the stack become empty*/
{
(*S)->top=(*S)->base;
(*S)->length=0;
}
Status StackEmpty(SqStack S) /*if empty?*/
{
if(S.top==S.base) return TRUE;
else
return FALSE;
}
void Push(Stack *S, Status e) /*enter stack:*/
{
if((*S)->top - (*S)->base>=(*S)->stacksize)
{
(*S)->base=(Status *) realloc((*S)->base,
((*S)->stacksize + 4) * sizeof( Status));
if(!(*S)->base) exit(-1);
(*S)->top=(*S)->base+(*S)->stacksize;
(*S)->stacksize += 4;
}
*((*S)->top++)=e;
++(*S)->length;
}
Status Pop(Stack *S) /*go outside:*/
{
Status fruit;
if((*S)->top==(*S)->base) return ERROR;
fruit=*((*S)->top);
(*S)->top--;

--(*S)->length;

return fruit ;
}
Status GetTop(Stack S, Status *e)/*return the first element*/
{
if(S->top==S->base) return ERROR;
*e=*(S->top-1);
S->top--;
}

main()
{
int a[20], i, j;

Stack s;
InitStack(&s);
printf("Input some nums please(within 5):\n");
for(i=0; i<SIZE; i++)
{
scanf("%d", &a[i]);
Push(&s, a[i]);
}

for(i=0; i<SIZE ; i++)
{
if (!StackEmpty(*s))
j=Pop(&s);
printf("%2d\n", j);
printf("\n");
}
DestroyStack(&s);
}

搜索更多相关主题的帖子: define Status int STACK typedef 
2005-12-19 18:54
程序冬天
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-12-15
得分:0 

最好把出错的地方也弄上来

2005-12-20 12:36
程序冬天
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-12-15
得分:0 
Status GetTop(Stack S, Status *e)/*return the first element*/
{
if(S->top==S->base) return ERROR;
*e=*(S->top-1);
S->top--;// 有必要减一吗?只是取出不做任何的修改
}
2005-12-20 12:37
C_ray
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2005-12-17
得分:0 

在函数Status Pop(Stack *S)中,我最终发现了Bug!
fruit=*((*S)->top);
(*S)->top--;
此处,两行代码的位置颠倒了。正确的理解,我认为
栈顶指针top应该是指向最后入栈元素的上一个位置。
出栈,即top不断向下偏移。
仍然感谢 程序冬天 的热心帮助!


2005-12-20 15:34



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-38941-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.130823 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved