白轼泽 发表于 2019-3-10 16:32:04

顺序栈的出入栈问题

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

#define MaxSize 100
#define ERROR 0
#define OK    1
typedef char ElemType;
typedef int Status;

typedef struct
{
    ElemType *base;
    ElemType *top;
    int StackSize;
}SqStack;

Status InitialStack(SqStack &S)//初始栈
{
    S.base=new ElemType;
    if(!S.base) //存储分配失败
      return ERROR;
    S.top=S.base;
    S.StackSize=MaxSize;
    return OK;
}

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

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

int main()
{
    SqStack S;
    char a,b;
    Status c;
    InitialStack(S);
    printf("输入要入栈的元素,以#结束输入\n");
    while(scanf("%c",&a)!=EOF)
    {
      if(a=='#')
            break;
      c=Push(S,a);
      if(c==ERROR)
      {
            printf("栈满\n");
            break;
      }
    }
    c=Pop(S,b);
    while(c==OK)
    {
      printf("%c\n",b);//从栈顶开始输出所有元素
      c=Pop(S,b);
    }
    return 0;
}

先谢过各位了

MerelyNight 发表于 2019-3-10 20:43:05

我调试了你的程序,发现问题在于第一个输入栈的数据无法输出出来,程序运行没有问题
你程序的问题在于初始化栈时,你将栈底地址赋予了栈顶,而出栈时又要求栈顶高于栈底时才能输出。
所以,只需要在初始化时将这一句
S.top=S.base;改为S.top=S.base+1;将栈顶的位置调高一点就可以成功运行
或者你也可以改变出栈的方式,但这就靠你自己去做了

白轼泽 发表于 2019-3-10 20:52:07

本帖最后由 白轼泽 于 2019-3-10 20:55 编辑

入栈的操作是按照书上写的,没有问题,不过我的出栈的确有问题,最后出栈那一步改为e=*--S.top;就可以了,多谢。另外我按照你的说法,对入栈修改为S.top=S.base+1而不修改出栈之后,结果把结束符#也入栈了

MerelyNight 发表于 2019-3-10 21:10:58

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

还好我最后留了一句,完美切合正确答案{:10_282:}
页: [1]
查看完整版本: 顺序栈的出入栈问题