#include <iostream>
#include <string>
#include <stack>
using namespace std;
string Change(string);
int main()
{
string exp;
while(1)
{
cout<<"请输入后缀表达式(数字)"<<endl;
getline(cin,exp);
if( exp == "#")
break;
cout<<"转换后的完全括号化的中缀表达式:"<<endl;
cout<<Change(exp)<<endl;
}
}
string Change(string exp)
{
string temp,answerexp,num_temp;
stack<string> s,s_change;
int count1 = 0,i = 0;
int flag =1;
while( i< exp.length())
{
if( exp[i] == ' ') i++;
else if( exp[i] == '*'|| exp[i] == '/' || exp[i] == '+' || exp[i] =='-')
{
count1 = 2; //这个是用来计算操作数的个数,因为遇到 一个 a b +这样类型的子表达式必
//然会变换成(a+b),而且只出栈两个操作数
temp += '(';
while( count1> 0)
{
s_change.push( s.top());
count1--;
s.pop();
}
while( !s_change.empty())
{
temp += s_change.top();
if( flag == 1) //这个是用来输入符号
{ temp += exp[i]; flag = 0;}
s_change.pop();
}
temp += ')';
flag = 1;
s.push( temp );
temp.clear();
i++;
}
else{
while( exp[i] >= '0' && exp[i] <= '9')
{
num_temp += exp[i]; //string类支持 +=操作,这语句实现多位数储存 例如 231
++i;
}
s.push( num_temp);
num_temp.clear(); //这个是因为要不断的取表达式的数字,如果不清空就会加多上次的记录
//例如 22 33 + 如果没有这句 那第二个操作数就会变成 2233 那显然错
}
}
answerexp += s.top();
s.pop();
return answerexp;
}
请输入后缀表达式(数字)
22 33 23 + - 22 -
转换后的完全括号化的中缀表达式:
((22-(33+23))-22)
请输入后缀表达式(数字)
#
Press any key to continue
[此贴子已经被作者于2005-11-10 22:34:15编辑过]