顺序栈的出入栈问题
求助大佬们,我的顺序栈算法哪个地方出错了。每次将所有出栈的时候,出来的结果与输入的结果总是不完全相符,第一个和最后一个元素总是不对函数中的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;
}
先谢过各位了 我调试了你的程序,发现问题在于第一个输入栈的数据无法输出出来,程序运行没有问题
你程序的问题在于初始化栈时,你将栈底地址赋予了栈顶,而出栈时又要求栈顶高于栈底时才能输出。
所以,只需要在初始化时将这一句
S.top=S.base;改为S.top=S.base+1;将栈顶的位置调高一点就可以成功运行
或者你也可以改变出栈的方式,但这就靠你自己去做了
本帖最后由 白轼泽 于 2019-3-10 20:55 编辑
入栈的操作是按照书上写的,没有问题,不过我的出栈的确有问题,最后出栈那一步改为e=*--S.top;就可以了,多谢。另外我按照你的说法,对入栈修改为S.top=S.base+1而不修改出栈之后,结果把结束符#也入栈了 白轼泽 发表于 2019-3-10 20:52
入栈的操作是按照书上写的,没有问题,不过我的出栈的确有问题,最后出栈那一步改为e=*--S.top;就可以了, ...
还好我最后留了一句,完美切合正确答案{:10_282:}
页:
[1]