中缀表达式转后缀表达式
#include <iostream>
#include <stack>
using namespace std;
//返回符号优先级
int prio(char op){
int prio;
if(op == '*' || op == '/'){
prio = 2;
}
if(op == '+' || op == '-'){
prio = 1;
}
if(op == '('){
prio = 0;
}
return prio;
}
bool trans(string &str, string & str1){
stack<char> s;
int i = 0;
for(i = 0; i < str.size(); i++){
if(str[i] >= '0' && str[i] <= '9'){ //是数字直接写到式子上
str1 += str[i];
}else{
if(s.empty()){ //栈内空,直接进栈
s.push(str[i]);
} else if(str[i] == '('){ //左括号可直接进栈
s.push(str[i]);
} else if(str[i] == ')'){ //右括号,弹出栈内元素,直到(
while(s.top() != '('){
str1 += s.top();
s.pop();
}
s.pop();
} else {
while(prio(str[i]) <= prio(s.top())){ //符号优先级小于栈内符号优先级
str1 += s.top(); //栈内符号出栈
s.pop();
if(s.empty()){
break;
}
}
s.push(str[i]);
}
}
}
while(!s.empty()){ //最后栈内不是空的,弹出栈内所有符号
str1+= s.top();
s.pop();
}
return true;
}
int main(int argc, char** argv) {
string infix, postfix;
cin >> infix;
trans(infix, postfix);
cout << postfix << endl;
return 0;
}