鱼C论坛

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

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

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

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

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

x
编译没有错误,但是运行时 按了入栈  我设置了按0结束入栈  但是在取栈顶元素的时候 栈顶元素为0,为什么会这样  要怎么改才行??
#include<iostream>
using namespace std;
#include<stdlib.h>
#include<string>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
#define OVERFLOW  -2
typedef int Status;

typedef int SElemType;
typedef struct
{
        SElemType *base;
        SElemType *top;
        int stacksize;
}SqStack;

Status InitStack(SqStack &S)//3.1构造一个空栈
{
        S.base=new SElemType[MAXSIZE];
        if(!S.base)
                exit(OVERFLOW);
        S.top=S.base;
        S.stacksize=MAXSIZE;
        return OK;
}
//3.2顺序栈的入栈
Status Push(SqStack &S, SElemType e)
{
        if(S.top-S.base==S.stacksize)
                return ERROR;
        *S.top++=e;
        
        return OK;
}

Status Pop(SqStack &S,SElemType &e)//3.3顺序栈的出栈
{
  if(S.top==S.base)
          return ERROR;
  e=*--S.top;
  return OK;
}
SElemType GetTop(SqStack S)//3.4取栈顶元素
{
        if(S.top!=S.base)
                return *(S.top-1);
}


int main()
{ 
     SqStack s;
     SElemType e,del;
         int choose=-1;
         int k;
         cout<<"建表"<<endl;
cout<<"入栈"<<endl;
cout<<"取栈顶元素"<<endl;
cout<<"出栈"<<endl;
         while(choose!=0)
         {                 
                 cin>>choose;
     switch(choose)
         {
         
         case 1:         
                 { 
                         if(InitStack(s))
                        {cout<<"建表成功"<<endl;}
                        else
                        {cout<<"建表失败"<<endl;}
                        break;
                 }
         case 2:    
                 
                 
                 
                 cout<<"请输入你想入栈的元素,按0结束。。"<<endl;
                 while(e)
                 {
                         cin>>e;
                         Push(s,e);
                 }
                
                break;

         case 3: 
                 if (GetTop(s))
                 cout<<GetTop(s)<<endl;
                 else
                         cout<<"没有元素啦"<<endl;
         break;
                 

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

更加恰当的做法是读入后立即判断,大概写成这样子:
while(true){
    cin>>e;
    if(e == 0) break;
    else Push(s,e);
}

当然这样写起来就不好看啦,所以简洁些的写法就像这样:
while(cin >> e, e) Push(s,e);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

更加恰当的做法是读入后立即判断,大概写成这样子:
while(true){
    cin>>e;
    if(e == 0) break;
    else Push(s,e);
}

当然这样写起来就不好看啦,所以简洁些的写法就像这样:
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-12-23 17:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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