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

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

#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 Protege 中的Entities下面的界面删除了如何复原
  • ¥15 scrapy爬虫求帮
  • ¥15 imageEnView绘图问题
  • ¥15 关于#python#的问题:您好可以加您一下联系方式吗,在复现的时候确实有点问题难以解决
  • ¥15 联想电脑重装系统时无法发现硬盘
  • ¥15 MATLAB与UR10e实体机械臂建立通讯
  • ¥15 c++题需要快一点不用opencv
  • ¥15 关于#java#的问题:想要咨询Flowable流程引擎框架的问题
  • ¥15 vscode里面怎么用plaformio强调串口啊
  • ¥20 针对计算后数据做一致性检验可以用Bland Altman法吗