原则:
从左到右遍历中缀表达式:
1、如果是数字则直接输出;
2、如果是左括号,直接入栈;
3、如果是右括号,直接栈顶元素出栈并输出,直到遇到左括号,左括号只出栈,不输出;
4、如果是符号,如果优先级不高于栈顶符号则栈顶元素依次出栈并输出
如果遇到+、-符号,如果栈非空并且栈顶元素不是左括号,则出栈并且输出,否则当前符号入栈
如果是*、/符号,如果栈非空且栈顶元素是*或/,则出栈并输出,否则当前符号入栈
大家可以参考网上的一个流程图:https://blog.csdn.net/qq_34992845/article/details/70313588
C++实现代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
using namespace std;
int main(){
string s;
string s_back;
getline(cin,s);
stack<char> stk;
for(int i=0;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9'){
s_back.push_back(s[i]);
if(s[i+1]>'9'||s[i+1]<'0')s_back.push_back(' '); //为了保证多位数比如10的连续输出
}
else if(s[i]=='+'||s[i]=='-'){
while(1){
if(!stk.empty() && stk.top()!='('){ //表达式中+,-的优先级最低,所以只要栈顶不为‘(’,就都要出栈
s_back.push_back(stk.top()); //为了用空格分开
s_back.push_back(' ');
stk.pop();
}
else{
stk.push(s[i]);
//s_back.push_back(' ');
break;
}
}
}
else if(s[i]=='*'||s[i]=='/'){
while(1){
if(!stk.empty() && (stk.top()=='*'|| stk.top()=='/')){ //优先级不高于* /的
s_back.push_back(stk.top());
s_back.push_back(' '); //为了用空格分开
stk.pop();
}
else{
stk.push(s[i]);
break;
}
}
}
else if(s[i]=='('){
stk.push(s[i]);
}
else if(s[i]==')'){
while(1){
if(stk.top()!='('){
s_back.push_back(stk.top());
s_back.push_back(' '); //为了用空格分开
stk.pop();
}
stk.pop(); //删除'('
break;
}
}
}
while(!stk.empty()){
s_back.push_back(stk.top());
s_back.push_back(' '); //为了用空格分开
stk.pop();
}
cout<<s_back<<endl;
return 0;
}
运行结果:
9+(3-1)*3+10/2
9 3 1 - 3 * + 10 2 / +
Program ended with exit code: 0