无限循环中~
#include <iostream>
using namespace std;
class Stack
{
public:
Stack();
string push(string);
char pop(string&);
int Bors(char);
private:
string inOP;
string outB;
};
int Stack::Bors(char bVal)
{
switch(bVal)
{
case '#':
return 0;
case '+': case '-':
return 2;
case '*': case '/':
return 3;
case '^':
return 4;
default :
return 1;
}
}
Stack::Stack(){inOP="#";outB="";}
string Stack::push(string Sval)
{
string temp;
int i=0;
while(Sval[i])
{
temp=Sval[i];
i++;
switch (temp[0])
{
case '+': case '-': case '*': case '/':
{
if (Bors(inOP[inOP.size()-1])<=Bors(temp[0]))
inOP+=temp[0];
else
{
while(Bors(inOP[inOP.size()-1])>Bors(temp[0]))//如果栈顶元素大于temp的话就出栈
outB+=pop(inOP);
inOP+=temp[0];
}
break;
}
case '(':
inOP+=temp[0];break;
case ')':
while(inOP[inOP.size()-1]!='(')
outB+=pop(inOP);
pop(inOP);
break;
default:
outB+=temp;
}
}
while (inOP[inOP.size()-1]!='#')
outB+=pop(inOP);
Sval=outB;
return Sval;
}
char Stack::pop(string &val)
{
char chPop;
string tempVal;
chPop=val[val.size()-1];
for(int i=0;i<val.size()-1;i++)
tempVal+=val[i];
val=tempVal;
return chPop;
}
int main()
{
Stack st;
string abc;
int i=0;
cout<<"请输入一个合法表达式:";
cin>>abc;
while (st.push(abc)[i])
{
cout<<st.push(abc)[i]<<" ";
i++;
}
system("pause");
return 0;
}
会出现无限循环!我是想让他输出每个字符中间有空格
问题点数:20、回复次数:13Top
1 楼dongyuanzhang(阿林)回复于 2005-01-28 21:47:18 得分 0
ctrl + dTop
2 楼pdaliu(刘星)回复于 2005-01-28 21:52:28 得分 0
啊?因为push会反回一个string型的字串,所以我认为是可以用[]的啊!为什么用不了啊1Top
3 楼paddy102(▄︻┻┳═一)回复于 2005-01-28 23:59:12 得分 0
cout<<"请输入一个合法表达式:";
cin>>abc;
while (st.push(abc)[i])
{
cout<<st.push(abc)[i]<<" ";
i++;
}
不断的调用st.push(abc),也就是重复往堆栈中填入字符串abc,while循环当然就不会停止了。所以这里的问题并非出在[]操作符上。
解决方法:
可以在堆栈定义中加入Peek()方法,检查堆栈中元素而不用像pop()一样弹出元素,觉得可以达到楼主的本来目的。Top
4 楼idau7((小i不怕)我爱Eva)回复于 2005-01-29 00:17:36 得分 0
支持 paddy102(▄︻┻┳═一)Top
5 楼zxs790501(沧海一粟)回复于 2005-01-29 12:10:08 得分 0
while (st.push(abc)[i])
条件永远为true,哪能停下来啊?Top
6 楼pdaliu(刘星)回复于 2005-01-30 14:11:49 得分 0
但是如果再加一个string的变量如下:
int main()
{
Stack st;
string abc,tem;
int i=0;
cout<<"请输入一个合法表达式:";
cin>>abc;
tem=st.push(abc);
while (tem[i])
{
cout<<tem[i]<<" ";
i++;
}
system("pause");
return 0;
}
这样就可以了!是为什么啊!tem的值不就是push反回的吗?Top
7 楼UPCC(杂食动物)回复于 2005-01-30 20:10:41 得分 10
while (st.push(abc)[i])只要while()里的条件为假就跳出循环了,假的条就有'\0', 0, EOF,在这里体现为EOF(文件或……的结束),Ctrl + D就是输入EOF
这样就可以了!是为什么啊!tem的值不就是push反回的吗?
----------------------------------------------------
字符串的末尾是'\0',就是假的条件了,当到这里是就跳出了Top
8 楼UPCC(杂食动物)回复于 2005-01-30 20:12:14 得分 0
第一个条件没有看清楚,说错了。Top
9 楼UPCC(杂食动物)回复于 2005-01-30 20:15:36 得分 0
st.push(abc)[i]这里的返回值没有空过啊!Top
10 楼zhengwei1984222(阿什坎迪.兄弟会之剑)回复于 2005-01-30 21:42:38 得分 0
中缀式传后缀式吧
程序本身没错
你是想输入一个表达式就打印一个结果吗?Top
11 楼pdaliu(刘星)回复于 2005-01-31 09:25:10 得分 0
tem的值不是和st.push的值完全等价于的吗?怎么st.push[i]没有空过啊?Top
12 楼chongzhou123(重舟)回复于 2005-01-31 11:14:11 得分 10
用Dev-C++编译调试一下就明白了的。
原来这段代码
while (st.push(abc)[i])
{
cout<<st.push(abc)[i]<<" ";
i++;
}
会在每次调用while语句的时候重新执行st.push(abc)[i],也就是说while语句的条件永远为真,不可能结束的。
而改成
tem=st.push(abc);
while (tem[i])
{
cout<<tem[i]<<" ";
i++;
}
则只调用了一次push,while语句在运行到字串结束的时候自然也就结束了。
Top
13 楼pdaliu(刘星)回复于 2005-01-31 21:23:59 得分 0
那每次调用push的反回值应该是一样的啊?
反回值是一样的还有i的值是在变化啊!Top




