鱼C论坛

 找回密码
 立即注册
查看: 2153|回复: 3

[已解决]顺序栈的出入栈问题

[复制链接]
发表于 2019-3-10 16:32:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求助大佬们,我的顺序栈算法哪个地方出错了。每次将所有出栈的时候,出来的结果与输入的结果总是不完全相符,第一个和最后一个元素总是不对
函数中的SqStack &S和ElemType &e让参数能够双向传递,这里使用了c++引用特性,所以调试时请将文件改为c++格式。c++里的new的作用和malloc一致
  1. #include <iostream>
  2. #include <stdio.h>
  3. using namespace std;

  4. #define MaxSize 100
  5. #define ERROR 0
  6. #define OK    1
  7. typedef char ElemType;
  8. typedef int Status;

  9. typedef struct
  10. {
  11.     ElemType *base;
  12.     ElemType *top;
  13.     int StackSize;
  14. }SqStack;

  15. Status InitialStack(SqStack &S)//初始栈
  16. {
  17.     S.base=new ElemType[MaxSize];
  18.     if(!S.base) //存储分配失败
  19.         return ERROR;
  20.     S.top=S.base;
  21.     S.StackSize=MaxSize;
  22.     return OK;
  23. }

  24. Status Push(SqStack &S,ElemType e)//入栈,从栈顶插入新的元素
  25. {
  26.     if(S.top-S.base==S.StackSize)//栈满
  27.         return ERROR;
  28.     *S.top++=e;
  29.     return OK;
  30. }

  31. Status Pop(SqStack &S,ElemType &e)//出栈,删除栈顶元素
  32. {
  33.     if(S.top==S.base)//栈空
  34.         return ERROR;
  35.     e=*S.top--;
  36.     return OK;
  37. }

  38. int main()
  39. {
  40.     SqStack S;
  41.     char a,b;
  42.     Status c;
  43.     InitialStack(S);
  44.     printf("输入要入栈的元素,以#结束输入\n");
  45.     while(scanf("%c",&a)!=EOF)
  46.     {
  47.         if(a=='#')
  48.             break;
  49.         c=Push(S,a);
  50.         if(c==ERROR)
  51.         {
  52.             printf("栈满\n");
  53.             break;
  54.         }
  55.     }
  56.     c=Pop(S,b);
  57.     while(c==OK)
  58.     {
  59.         printf("%c\n",b);//从栈顶开始输出所有元素
  60.         c=Pop(S,b);
  61.     }
  62.     return 0;
  63. }
复制代码

先谢过各位了
最佳答案
2019-3-10 20:43:05
我调试了你的程序,发现问题在于第一个输入栈的数据无法输出出来,程序运行没有问题
你程序的问题在于初始化栈时,你将栈底地址赋予了栈顶,而出栈时又要求栈顶高于栈底时才能输出。
所以,只需要在初始化时将这一句
S.top=S.base;改为S.top=S.base+1;将栈顶的位置调高一点就可以成功运行
或者你也可以改变出栈的方式,但这就靠你自己去做了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-10 20:43:05 | 显示全部楼层    本楼为最佳答案   
我调试了你的程序,发现问题在于第一个输入栈的数据无法输出出来,程序运行没有问题
你程序的问题在于初始化栈时,你将栈底地址赋予了栈顶,而出栈时又要求栈顶高于栈底时才能输出。
所以,只需要在初始化时将这一句
S.top=S.base;改为S.top=S.base+1;将栈顶的位置调高一点就可以成功运行
或者你也可以改变出栈的方式,但这就靠你自己去做了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-10 20:52:07 | 显示全部楼层
本帖最后由 白轼泽 于 2019-3-10 20:55 编辑

入栈的操作是按照书上写的,没有问题,不过我的出栈的确有问题,最后出栈那一步改为e=*--S.top;就可以了,多谢。另外我按照你的说法,对入栈修改为S.top=S.base+1而不修改出栈之后,结果把结束符#也入栈了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-10 21:10:58 | 显示全部楼层
白轼泽 发表于 2019-3-10 20:52
入栈的操作是按照书上写的,没有问题,不过我的出栈的确有问题,最后出栈那一步改为e=*--S.top;就可以了, ...

还好我最后留了一句,完美切合正确答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 22:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表