gem456 发表于 2016-4-26 14:01:27

顺序栈的一个小系统 入栈那里出了问题

编译没有错误,但是运行时 按了入栈我设置了按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;
        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;
       }
       }
}

gem456 发表于 2016-4-28 13:05:30

求大神帮忙,小弟真的看不出来了。。。。。。。。。。。

rowang 发表于 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);

gem456 发表于 2016-5-3 14:07:05

谢谢你,楼主不胜感激

rowang 发表于 2016-5-4 09:22:36

gem456 发表于 2016-5-3 14:07
谢谢你,楼主不胜感激

嗯,相互帮助咯~

wj561188 发表于 2016-5-4 23:19:25

{:10_279:}

zhouxcpython 发表于 2016-6-3 15:52:28

感谢分享
页: [1]
查看完整版本: 顺序栈的一个小系统 入栈那里出了问题