鱼C论坛

 找回密码
 立即注册
查看: 3403|回复: 6

[已解决]顺序栈的一个小系统 入栈那里出了问题

[复制链接]
发表于 2016-4-26 14:01:27 | 显示全部楼层 |阅读模式

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

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

x
编译没有错误,但是运行时 按了入栈  我设置了按0结束入栈  但是在取栈顶元素的时候 栈顶元素为0,为什么会这样  要怎么改才行??

  1. #include<iostream>
  2. using namespace std;
  3. #include<stdlib.h>
  4. #include<string>
  5. #define OK 1
  6. #define ERROR 0
  7. #define MAXSIZE 100
  8. #define OVERFLOW  -2
  9. typedef int Status;

  10. typedef int SElemType;
  11. typedef struct
  12. {
  13.         SElemType *base;
  14.         SElemType *top;
  15.         int stacksize;
  16. }SqStack;

  17. Status InitStack(SqStack &S)//3.1构造一个空栈
  18. {
  19.         S.base=new SElemType[MAXSIZE];
  20.         if(!S.base)
  21.                 exit(OVERFLOW);
  22.         S.top=S.base;
  23.         S.stacksize=MAXSIZE;
  24.         return OK;
  25. }
  26. //3.2顺序栈的入栈
  27. Status Push(SqStack &S, SElemType e)
  28. {
  29.         if(S.top-S.base==S.stacksize)
  30.                 return ERROR;
  31.         *S.top++=e;
  32.        
  33.         return OK;
  34. }

  35. Status Pop(SqStack &S,SElemType &e)//3.3顺序栈的出栈
  36. {
  37.   if(S.top==S.base)
  38.           return ERROR;
  39.   e=*--S.top;
  40.   return OK;
  41. }
  42. SElemType GetTop(SqStack S)//3.4取栈顶元素
  43. {
  44.         if(S.top!=S.base)
  45.                 return *(S.top-1);
  46. }


  47. int main()
  48. {
  49.      SqStack s;
  50.      SElemType e,del;
  51.          int choose=-1;
  52.          int k;
  53.          cout<<"建表"<<endl;
  54. cout<<"入栈"<<endl;
  55. cout<<"取栈顶元素"<<endl;
  56. cout<<"出栈"<<endl;
  57.          while(choose!=0)
  58.          {                 
  59.                  cin>>choose;
  60.      switch(choose)
  61.          {
  62.          
  63.          case 1:         
  64.                  {
  65.                          if(InitStack(s))
  66.                         {cout<<"建表成功"<<endl;}
  67.                         else
  68.                         {cout<<"建表失败"<<endl;}
  69.                         break;
  70.                  }
  71.          case 2:   
  72.                  
  73.                  
  74.                  
  75.                  cout<<"请输入你想入栈的元素,按0结束。。"<<endl;
  76.                  while(e)
  77.                  {
  78.                          cin>>e;
  79.                          Push(s,e);
  80.                  }
  81.                
  82.                 break;

  83.          case 3:
  84.                  if (GetTop(s))
  85.                  cout<<GetTop(s)<<endl;
  86.                  else
  87.                          cout<<"没有元素啦"<<endl;
  88.          break;
  89.                  

  90.          case 4:
  91.                  cout<<"栈顶元素出栈。。。"<<endl;
  92.                  
  93.                  Pop(s,e);
  94.                  cout<<"出栈的元素为:"<<e<<endl;
  95.                  break;
  96.          }
  97.          }
  98. }
复制代码
最佳答案
2016-5-2 20:00:35
考虑你输入了一个0之后会发生什么,
  1. cout<<"请输入你想入栈的元素,按0结束。。"<<endl;
  2. while(e){
  3.     cin>>e; // 假定这儿读入了一个 0
  4.     Push(s,e); // 那么这儿就紧接着将其压入栈中,当下一次来到while(e)这一行时,才退出
  5. }
复制代码

所以会栈中会多出一个0。

更加恰当的做法是读入后立即判断,大概写成这样子:

  1. while(true){
  2.     cin>>e;
  3.     if(e == 0) break;
  4.     else Push(s,e);
  5. }
复制代码


当然这样写起来就不好看啦,所以简洁些的写法就像这样:

  1. while(cin >> e, e) Push(s,e);
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-4-28 13:05:30 | 显示全部楼层
求大神帮忙,小弟真的看不出来了。。。。。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-2 20:00:35 | 显示全部楼层    本楼为最佳答案   
考虑你输入了一个0之后会发生什么,
  1. cout<<"请输入你想入栈的元素,按0结束。。"<<endl;
  2. while(e){
  3.     cin>>e; // 假定这儿读入了一个 0
  4.     Push(s,e); // 那么这儿就紧接着将其压入栈中,当下一次来到while(e)这一行时,才退出
  5. }
复制代码

所以会栈中会多出一个0。

更加恰当的做法是读入后立即判断,大概写成这样子:

  1. while(true){
  2.     cin>>e;
  3.     if(e == 0) break;
  4.     else Push(s,e);
  5. }
复制代码


当然这样写起来就不好看啦,所以简洁些的写法就像这样:

  1. while(cin >> e, e) Push(s,e);
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-3 14:07:05 | 显示全部楼层
谢谢你,楼主不胜感激
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-4 09:22:36 | 显示全部楼层
gem456 发表于 2016-5-3 14:07
谢谢你,楼主不胜感激

嗯,相互帮助咯~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-4 23:19:25 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-3 15:52:28 | 显示全部楼层
感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 14:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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