#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main()
{
string mid;
stack<char> stk;
stack<char> cal;
cin>>mid;
int len=mid.length();
for(int i=len-1;i>=0;i--)
{
char tmp;
tmp=mid[i];
if(tmp=='+')
{
if(!cal.empty())
{
if(cal.top()==')')
{
cal.push(tmp);
}
else
{
while((cal.top()=='*')||(cal.top()=='/'))
{
stk.push(cal.top());
cal.pop();
if(cal.empty())
{
break;
}
}
}
}
cal.push(tmp);
}
else if(tmp=='-')
{
if(!cal.empty())
{
if(cal.top()==')')
{
cal.push(tmp);
}
else
{
while((cal.top()=='*')||(cal.top()=='/'))
{
stk.push(cal.top());
cal.pop();
if(cal.empty())
{
break;
}
}
}
}
cal.push(tmp);
}
else if(tmp=='*')
{
cal.push(tmp);
}
else if(tmp=='/')
{
cal.push(tmp);
}
else if(tmp=='(')
{
while(cal.top()!=')')
{
stk.push(cal.top());
cal.pop();
}
cal.pop();
}
else if(tmp==')')
cal.push(tmp);
else
stk.push(tmp);
}
while(!cal.empty())
{
stk.push(cal.top());
cal.pop();
}
while(!stk.empty())
{
cout<<stk.top();
stk.pop();
}
return 0;
}
注意点:
1:,使用两个堆栈,cal堆栈用来保存运算符号,stk堆栈用来保存数字,或者称之为即将要输出的式子。
2,从,右往左阅读式子,因为我们知道,前缀表达式是数字在后,运算符号再前。
3,符号堆栈的特点,堆栈是LIFO,所以,我们知道,前缀表达式堆栈的顶端必然是符号优先级最低的。先不考虑括号,我们知道,(1)+,-,符号优先级比*,/符号要低,(2)靠右的,同等级的要比靠左的要低。而右边先读,所以第(2)点不需要考虑。
4,要满足优先级要求,当+,- 号遇到乘除时,必然要把乘除号推出栈顶。也就有了上面的while()循环。把高优先级的先输出咯,所以就先转移到stk堆栈,因为是按顺序输出的。