鱼C论坛

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

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

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

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

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

x
求助大佬们,我的顺序栈算法哪个地方出错了。每次将所有出栈的时候,出来的结果与输入的结果总是不完全相符,第一个和最后一个元素总是不对
函数中的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[MaxSize];
    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;
}
先谢过各位了
最佳答案
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, 2025-2-24 22:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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