栈满问题

#include<stdio.h>#include<stdlib.h>#define STACK_INIT_SIZE 10 //#define STACKINCREMENT 10#define OK 1#define ERROR 0#define OVERFLOW -2typedef struct stack{ int *base; int *top; int stacksize;//当前已分配的存储空间,以元素为单位}SqStack;int InitStack(SqStack & S){//构造一个空栈 S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int)); if(!S.base) exit(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK;}int GetStack(SqStack S,int &e){//弱栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR if(S.top==S.base) return ERROR; e=*(S.top-1);// S.top++; return OK;}int Push(SqStack &S,int e){//插入元素e为新的栈顶元素 //if(S.top-S.base>=S.stacksize)//栈满,追加存储空间 //{ // S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int)); // if(!S.base) exit(OVERFLOW);//存储空间分配失败 // S.top=S.base+S.stacksize; // S.stacksize+=STACKINCREMENT; //} *S.top++=e; //S.top++; return OK;}int Pop(SqStack &S,int &e){//弱栈不空,则删除栈S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR if(S.top==S.base) return ERROR; e=*--S.top; return OK;}int main(void){ SqStack S; int stat,i,e,n; stat=InitStack(S); printf("请输入你要进栈的元素个数n:"); scanf("%d",&n); for(i=0;i<n;i++) { printf("尀n请输入你要进栈的元素e:"); scanf("%d",&e); stat=Push(S,e); } stat=GetStack(S,e); printf("尀n输出出栈的元素:"); for(i=0;i<n;i++) { stat=Pop(S,e); printf("%3d尀n",e); } return 0;}这个程序原本是被我有意改错的啊,我吧栈满之后要申请空间的那几句给去掉了,结果输入输出却依然满足栈的先进后出的情况,很奇怪,在上面的程序中栈最大可以输入9个整数空间,结果我输入15个还是安装先进后出的效果打的,不知道咋回事了?
2026年09月24日 14:46
有2个网友回答
网友(1):

在源程序上增加测试指针,可以看出,test的值的变化,这说明去掉对空间的判断,将引来严重后果。如果最大值是22,输入25个测试数据,看看test变化

#include
#include
#define STACK_INIT_SIZE 10 //
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct stack{
int *base;
int *top;
int stacksize;//当前已分配的存储空间,以元素为单位
}SqStack;

double *test;//测试指针

int InitStack(SqStack & S)
{//构造一个空栈
S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;

//增加test空间,并显示分配内存地址,记录最大个数
test=(double*)malloc(sizeof(double));
printf("S.base=%p,Smax=%p,test=%p\n",S.base,S.base+S.stacksize,test);
printf("最大个数为:%d\n",(int*)test-S.base);
return OK;
}

int GetStack(SqStack S,int &e)
{//弱栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
if(S.top==S.base) return ERROR;
e=*(S.top-1);
// S.top++;
return OK;
}
int Push(SqStack &S,int e)
{//插入元素e为新的栈顶元素
//if(S.top-S.base>=S.stacksize)//栈满,追加存储空间
//{
// S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
// if(!S.base) exit(OVERFLOW);//存储空间分配失败
// S.top=S.base+S.stacksize;
// S.stacksize+=STACKINCREMENT;
//}

*S.top++=e;
//S.top++;
return OK;

}

int Pop(SqStack &S,int &e)
{//弱栈不空,则删除栈S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}

int main(void)
{
SqStack S;
int stat,i,e,n;
stat=InitStack(S);
printf("请输入你要进栈的元素个数n:");
scanf("%d",&n);
*test=3.14;
printf("test初值=%lf\n",*test);
for(i=0;i {
printf("\n请输入你要进栈的元素e:");
scanf("%d",&e);
stat=Push(S,e);
}
printf("test现在值=%lf\n",*test);
stat=GetStack(S,e);
printf("\n输出出栈的元素:");
for(i=0;i {
stat=Pop(S,e);
printf("%3d\n",e);
}
return 0;
}

网友(2):

这是应为你在分配了初始的十个空间后,从输入第十一个元素开始,覆盖了内存中的原来的数据,这是很危险的,所以为安全起见,当超过十个空间后,应另分配其他的空间来装载你的数据。