中缀表达式到后缀表达式的转换
具体操作看这位大佬的博客前缀、中缀、后缀表达式(逆波兰表达式),本人用c++实现了加减乘除四种运算符的转换:
代码:
#include<bits/stdc++.h>
using namespace std;
//2+8/6-(7-5x4+9x2/7)
string convertInfixToPRN(const string& exp)
{
int len=exp.length();
stack<char> stack_ans,stack_operator;
int pos=0;
while(pos<=len-1){
if(exp[pos]<='9'&&exp[pos]>='0'){
while(pos<exp.length()&&exp[pos]<='9'&&exp[pos]>='0') {stack_ans.push(exp[pos]);pos++;}
pos--;
}
else if(exp[pos]=='*'){
while(!stack_operator.empty()&&(stack_operator.top()=='*'||stack_operator.top()=='/')){
stack_ans.push(stack_operator.top());
stack_operator.pop();
}
stack_operator.push(exp[pos]);
}
else if(exp[pos]=='/'){
while(!stack_operator.empty()&&(stack_operator.top()=='*'||stack_operator.top()=='/')){
stack_ans.push(stack_operator.top());
stack_operator.pop();
}
stack_operator.push(exp[pos]);
}
else if(exp[pos]=='+'){
while(!stack_operator.empty()&&(stack_operator.top()=='*'||stack_operator.top()=='/'||stack_operator.top()=='+'||stack_operator.top()=='-')){
stack_ans.push(stack_operator.top());
stack_operator.pop();
}
stack_operator.push(exp[pos]);
}
else if(exp[pos]=='-'){
while(!stack_operator.empty()&&(stack_operator.top()=='*'||stack_operator.top()=='/'||stack_operator.top()=='+'||stack_operator.top()=='-')){
stack_ans.push(stack_operator.top());
stack_operator.pop();
}
stack_operator.push(exp[pos]);
}
else if(exp[pos]=='(') stack_operator.push(exp[pos]);
else if(exp[pos]==')'){
while(stack_operator.top()!='('){
stack_ans.push(stack_operator.top());
stack_operator.pop();
}
stack_operator.pop();
}
pos++;
}
string ans;
while(!stack_operator.empty()){stack_ans.push(stack_operator.top());stack_operator.pop();}
while(!stack_ans.empty()){ans=stack_ans.top()+ans;stack_ans.pop();}
return ans;
}
int main()
{
string tmp;
cin >>tmp;
cout <<convertInfixToPRN(tmp) <<endl;
}
样例: