首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于栈的容易程序,初学栈,觉得函数都没错,题目意思也表达清楚了,为什么运行结果不对呢?求解!

2013-10-24 
关于栈的简单程序,初学栈,觉得函数都没错,题目意思也表达清楚了,为什么运行结果不对呢?求解!!!//程序中可

关于栈的简单程序,初学栈,觉得函数都没错,题目意思也表达清楚了,为什么运行结果不对呢?求解!!!

//程序中可以使用一个栈来逐行处理从终端输入的字符。
//每次从终端接收一个字符后先作如下判断,如果它既不是"#"也不是"@",则将该字符压入栈顶;
//如果是"#"则从栈顶删去一个字符;如果是"@",则把字符栈清空。

#include <iostream>

#define MaxSize 50

using namespace std;

typedef struct sqstack{
char data[MaxSize];
int top;
}SqStack;

void InitStack(SqStack *&s)//初始化栈
{
s = new SqStack;
s->top = -1;
}

int EmptyStack(SqStack *s)//判空
{
return(s->top == -1);
}

int FullStack(SqStack *s)//判满
{
return(s->top == MaxSize - 1);
}

void PopStack(SqStack *s)//删除栈顶元素
{
s->top --;
}

int Push(SqStack *s, char e)//将元素压入栈中
{
if(FullStack(s))
{
return 0;
}
s->top ++;
s->data[s->top] = e;
return 1;
}

void ClearStack(SqStack *s)//将栈清空
{
s->top = -1;
}

void DispStack(SqStack *s)//输出栈
{
int i;
if(EmptyStack(s))
cout<<"Stack is empty!"<<endl;
else
{
cout<<"Stack is:"<<endl;
for(i=s->top;i>=0;i--)
cout<<s->data[i]<<' ';
cout<<endl;
}
}

void main()
{
SqStack *s = NULL;
InitStack(s);
char a;
while(getchar()!='\n')
{
cin>>a;
if(a == '#')
{
PopStack(s);
}
else if(a == '@')
{
ClearStack(s);
}
else
{
Push(s, a);
}
}
DispStack(s);
}



输入ABCD,运行结果竟然是D B 百思不得其解啊,到底是哪儿出了问题,望亲们告之,感激不尽! 栈
[解决办法]
 getchar()这个函数从流中获取了一个字符,但没有赋给任何变量。
假设输入ABCD
A 由getchar()接收,
B 由cin >> a;接收,
C 由getchar()接收,
D 由cin >> a;接收。
所以实际你只从流中获取了B和D。

修改代码:
//...
while ((a = getchar()) != '\n')
{
//cin >> a;
if (a == '#')
{
PopStack(s);

}
//...

[解决办法]
我也看不明白楼主为什么在while循环那里要先加一个getchar来取缓冲区的数据!

楼主说说意图把?
[解决办法]
作为我们新手, 下断点单步调试是比较好的学习方法, 不要总是靠眼睛看程序有没有问题, 需要的是单步执行程序, 看为什么错, 哪里与我们想想的执行步骤不一样.
[解决办法]
引用:
 getchar()这个函数从流中获取了一个字符,但没有赋给任何变量。
假设输入ABCD
A 由getchar()接收,
B 由cin >> a;接收,
C 由getchar()接收,
D 由cin >> a;接收。
所以实际你只从流中获取了B和D。

修改代码:
//...
while ((a = getchar()) != '\n')
{
//cin >> a;
if (a == '#')
{
PopStack(s);

}
//...

正解,输入有问题!

热点排行