本帖最后由 我叫MD 于 2020-6-4 22:10 编辑
我给你改下代码 5分钟 稍等
我给你改了下代码,能用了,Push函数我相当于在你的逻辑上面重写了一下,所以重点是Push函数,我加了很多注释,你应该能看懂
首先,给你的栈初始化void Stack() {
int n;
SqStack S;
//这里其实就加了这么一行
memset(&S, 0, sizeof(SqStack));
do {
printf("\n");
printf("****************栈的基本操作及应用*****************\n");
printf("* 1 进栈 *\n");
printf("* 2 出栈 *\n");
printf("* 3 取栈顶元素 *\n");
printf("* 4 应用 *\n");
printf("* 5 退出 *\n");
printf("***************************************************\n");
printf("请选择:");
scanf_s("%d", &n);
switch (n) {
case 1:
Push(S); break;
case 2:
Pop(S); break;
case 3:
GetTop(S); break;
case 4:
printf("--------应用-------"); break;
case 5:break;
default:
printf("ERROR!"); break;
}
} while (n != 5);
}
Push函数,这个是你主要看的int Push(SqStack &S)
{
//变量赋初值
char e = '\0';
//获取输入的字符,如果为换行,则重新获取
while ((e = getchar()) == '\n')
{
}
//如果还没有申请空间,则申请空间
if (S.base == NULL || S.top == NULL)
{
//先申请 STACKINCREMENT 空间
S.base = (char*)calloc(sizeof(char), STACKINCREMENT);
if (S.base == NULL)
{
printf("空间申请失败\n");
exit(1);
}
//栈顶和栈底指向同一个位置
S.top = S.base;
//保存目前栈的大小
S.stacksize = STACKINCREMENT;
}
else
{
//如果栈满,则申请更大的空间,将原先的数据保存
if (S.top - S.base >= S.stacksize)
{
//将栈底指向新申请的空间
S.base = (char*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(char));
//恢复栈顶
S.top = S.base + S.stacksize;
//更新栈的大小
S.stacksize += STACKINCREMENT;
}
}
*S.top = e;
S.top++;
return OK;
}
Pop函数,给你加了个判断,要不然当你栈空的时候,再弹数据,会出问题
int Pop(SqStack &S)
{
//这里加了个判断,以后这种小问题的注意
if (S.top == S.base)
{
printf("栈中没有数据\r\n");
return OK;
}
char e;
e = *--S.top;
printf("出栈:%c", e);
return OK;
}
好了,以上就是我修改的地方,你根据函数名,找到对应位置,改一下,应该差不多了 |