底部的代码可以直接运行
代码如下:
#include <iostream>
#include <stack>
#include <string>
using namespace std;
bool TransferExpress(string strExpress,string& newExpress);
int main()
{
string strExpress = "a+b*c+(d*e+f)*g";
//string strExpress = "a+b*d+c/d";
string newExpress;
if( TransferExpress(strExpress,newExpress) )
{
for(string::size_type index = 0; index != newExpress.size(); ++ index)
cout << newExpress.at(index) << " ";
}
system("pause");
return 0;
}
bool TransferExpress(string strExpress,string& newExpress)
{
stack<char> ExpressStack;
char ch = '0';
if(strExpress == "")
return false;
for(int i = 0;i<strExpress.length();i++)
{
ch = strExpress.at(i);
switch(ch)
{
case '+':
{
while( (!ExpressStack.empty()) && ( ExpressStack.top() == '*' || ExpressStack.top() == '/' || ExpressStack.top() == '+' || ExpressStack.top() == '-') )
{
// 注意while里的判断条件,当读入一个运算符时,要和栈顶往下所有连着运算符比较,比它运算级大和相同的都应该弹出来放到输出中
char pop = ExpressStack.top();
newExpress.append(1,pop);
ExpressStack.pop();
}
ExpressStack.push(ch);
break;
}
case '-':
{
while( (!ExpressStack.empty()) && ( ExpressStack.top() == '*' || ExpressStack.top() == '/' || ExpressStack.top() == '+' || ExpressStack.top() == '-') )
{
// 注意while里的判断条件,当读入一个运算符时,要和栈顶往下所有连着运算符比较,比它运算级大和相同的都应该弹出来放到输出中
char pop = ExpressStack.top();
newExpress.append(1,pop);
ExpressStack.pop();
}
ExpressStack.push(ch);
break;
}
case '*':
{
ExpressStack.push(ch);
break;
}
case '/':
{
ExpressStack.push(ch);
break;
}
case ')':
{
while( (!ExpressStack.empty() ) && ExpressStack.top() != '(' )
{
char pop = ExpressStack.top();
newExpress.append(1,pop);
ExpressStack.pop();
break;
}
if(ExpressStack.top() == '(') //不要忘记删除‘(’
ExpressStack.pop();
break;
}
case '(':
{
ExpressStack.push(ch);
break;
}
default:
{
newExpress.append(1,ch);
break;
}
}
}
while(!ExpressStack.empty())
{
char pop = ExpressStack.top();
newExpress.append(1,pop);
ExpressStack.pop();
}
cout << newExpress << endl;
return true;
}