描述
在日常应用中,算术表达式中运算符总是出现在两个操作数之间,例如5(7-23)+8/2,这种形式称为中缀表达式。计算一个中缀表达式需要知道运算符的优先级和结合性。乘除是高优先级,加减是低优先级,优先级相同时他们都是左结合的,也就是从左计算到右。有括号就要计算括号内的表达式。
中缀表达式利于人的理解,但不便于计算机的处理。因此需要将中缀表达式转换成后缀表达式,以方便计算机处理。所谓后缀表达式就是将运算符放在运算数之后。后缀表达式也称为逆波兰表达式。
比如:
中缀表达式为:1+(2-3)*4+4/2
对应后缀表达式为:1 2 3 - 4 * + 4 2 / +
现在请你编写一个程序,将输入的中缀表达式转换为后缀表达式。
输入描述
输入为一行字符串,包含一个中缀表达,运算符合操作数之间无空格。输入表达式中包含+、-、*、/、^(求次幂)5种运算。
输出描述
输出为一行字符串,为输入的后缀表达式,操作数和运算符之间用空格分隔。
用例输入 1
1+(2-3)*4+4/2
用例输出 1
1 2 3 - 4 * + 4 2 / +
c++ AC代码:
#include<bits/stdc++.h>
using namespace std;
char youxianji(char c)
{
if (c=='+' || c=='-') return 1;
if (c=='*' || c=='/') return 2;
else if (c=='^') return 3;
return 0;
}
int main()
{
string a;
cin>>a;
stack<char> li;
string s="";
for (int i=0;i<a.size();i++)
{
char c=a[i];
if (c>='0' && c<='9') s+=c;
if (i!=a.size()-1)
{
if (a[i+1]=='+' || a[i+1]=='-' || a[i+1]=='*' || a[i+1]=='/' || a[i+1]=='^' || a[i+1]==')')
{
if (s!="")
{
cout<<s<<" ";
s="";
}
}
}
if (c=='(') li.push(c);
else if (c==')')
{
while (!li.empty() && li.top()!='(')
{
cout<<li.top()<<" ";
li.pop();
}
li.pop();
}
else if (c=='+' || c=='-' || c=='*' || c=='/' || c=='^')
{
while (!li.empty() && (youxianji(li.top())>=youxianji(c)))
{
cout<<li.top()<<" ";
li.pop();
}
li.push(c);
}
}
if (s!="") cout<<s<<" ";
while (!li.empty())
{
cout<<li.top()<<" ";
li.pop();
}
}