ammmenga 2022-11-06 17:33 采纳率: 100%
浏览 37
已结题

入栈成功,出栈为什么是乱码?

#include <stdio.h>
#define ERROR 0
#define OK 1
#define MAXSIZE 1024 //顺序栈的最大容量
typedef int SElemType; //定义栈中元素类型,可调整
typedef struct{
SElemType data[MAXSIZE]; // 顺序栈
int top; //栈顶指针
}SeqStack;
//顺序栈的初始化
int InitStack_Sq (SeqStack *&S)
{
S = new SeqStack;
if(!S) //存储分配失败
return ERROR;
S->top=0; //设置栈顶指针值
return OK;
}
//求顺序栈的长度
int StackLength_Sq (SeqStack *S)
{
return S->top;
}
//销毁顺序栈
int DestroyStack_Sq(SeqStack *&S)
{
if(!S){
delete S;
return OK;
}
return ERROR;
}
//清空栈操作
void ClearStack_Sq (SeqStack *&S)
{
S->top=0;
}
//判断顺序栈是否为空
int StackEmpty_Sq (SeqStack *S)
{
return S->top=0;
}
//判断顺序栈是否已满
int StackFull_Sq (SeqStack *S)
{
return S->top==MAXSIZE;
}
//入栈操作
int Push_Sq(SeqStack *S, SElemType e)
{
if (StackFull_Sq(S))
return ERROR; //栈已满
S->data[S->top++]=e;
return OK;
}
//出栈操作
int Pop_Sq(SeqStack *S, SElemType &e)
{
if (StackEmpty_Sq(S))
return ERROR; // 栈空
e=S->data[--S->top];
return OK;
}
//取栈顶元素
int GetTop_Sq(SeqStack *S,SElemType &e)
{
if(StackEmpty_Sq(S)) // 栈空
return ERROR;
e=S->data[S->top-1];
return OK;
}
void DispStack_Sq(SeqStack *S) // 输出顺序栈
{
int p = S->top;
printf("顺序栈元素为:");
if (StackEmpty_Sq(S))
{
printf("栈空!\n");
return;
}
while(p!=0)
printf("%d ",S->data[--p]);
printf("\n");
}
void showmenu()
{

printf("      --顺序栈基本运算演示--       \n");
printf("*      1---顺序栈的初始化         *\n");
printf("*      2---销毁顺序栈             *\n"); 
printf("*      3---清空顺序栈             *\n");
printf("*      4---判断顺序栈是否为空     *\n");
printf("*      5---判断顺序栈是否已满     *\n");
printf("*      6---入栈操作               *\n");
printf("*      7---出栈操作               *\n");
printf("*      8---取栈顶元素             *\n");
printf("*                                 *\n");
printf("*      0---退出                   *\n");
printf("请选择菜单号(0--8):"); 

}
void Stack_Sq()
{
char choice='N';
SElemType item;
SeqStack *S;
int flag=0; //是否创建好了顺序栈
while(choice!='0')
{
showmenu();
_flushall();
scanf("%c",&choice);
switch(choice)
{
case '1':
printf("初始化顺序栈操作\n");
if(InitStack_Sq(S))
{
printf("初始化成功!\n");
flag=1; //标志顺序表的存在
}
else
printf("初始化失败!\n");
break;
case'2':
if(flag) //顺序栈存在
{
DestroyStack_Sq(S);
flag=0; //顺序栈已删除
printf("顺序栈删除成功!\n");
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case'3':
if(flag) //顺序栈存在
{
ClearStack_Sq(S);
printf("顺序栈清空成功!\n");
DispStack_Sq(S); //输出线性表
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case'4':
if(flag) //顺序栈存在
{
printf("顺序栈%s。\n",StackEmpty_Sq(S)?"空":"不空");
DispStack_Sq(S); //输出线性表
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case'5':
if(flag) //顺序栈存在
{
printf("顺序栈%s。\n",StackFull_Sq(S)?"空":"不空");
DispStack_Sq(S); //输出线性表
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case'6':
if(flag) //顺序栈存在
{
printf("请输入要入栈的元素的值:");
scanf("%d",&item);
if(Push_Sq(S,item))
printf("该元素已入栈\n");
else
printf("栈满,入栈操作失败!\n");
DispStack_Sq(S); //输出线性表
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case '7':
if(flag) //顺序栈存在
{
if(Pop_Sq(S,item))
printf("出栈元素为:%d。\n",item);
else
printf("栈空!\n");
DispStack_Sq(S);
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case '8':
if(flag) //顺序栈存在
{
if(GetTop_Sq(S,item))
printf("栈顶元素为:%d。\n",item);
else
printf("栈空!\n");
DispStack_Sq(S); // 输出线性表
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case '0':
printf("\n\t程序结束!\n");
DestroyStack_Sq(S);
break;
default:
printf("\n\t选择错误,请重新输入!\n");
break;
}
}
}
int main()
{
Stack_Sq();
return 0;
}

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-11-06 19:58
    关注

    两个函数有问题:
    销毁顺序栈函数:

    //销毁顺序栈
    int DestroyStack_Sq(SeqStack *&S)
    {
        if(S){   //修改 if(!S)
            delete S;
            return OK;
        }
        return ERROR;
    }
    
    

    判断顺序栈是否为空函数:

    //判断顺序栈是否为空
    int StackEmpty_Sq (SeqStack *S)
    {
        return S->top==0;//S->top=0; 修改
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月14日
  • 已采纳回答 11月6日
  • 创建了问题 11月6日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分