后缀表达式
#include<iostream> #include<string> #include<stack> using namespace std; int main() { string str; cin>>str; stack<char> s; for(int i=0;i<str.length();i++){ if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')){ //直接输出操作数 cout<<str[i]; }else if(str[i]=='+'||str[i]=='-'){ //操作符入栈,但要确保栈顶元素的优先级低于他,乘除 大于 加减大 于 括号 ,否则先弹出后入栈 while(true){ //左括号直接入栈,遇到右括号,将上一个左括号前操作符全部出栈 if(s.empty()){ break; } if(s.top()=='*'||s.top()=='/'||s.top()=='+'||s.top()=='-'){ cout<<s.top(); s.pop(); }else{ break; //左括号只有遇到右括号才弹出 } } s.push(str[i]); }else if(str[i]=='*'||str[i]=='/'){ while(true){ if(s.empty()){ break; } if(s.top()=='*'||s.top()=='/'){ //遇到更低才不继续弹出 cout<<s.top(); s.pop(); }else{ break; } } s.push(str[i]); }else if(str[i]=='('){ s.push(str[i]); }else{ while(true){ if(s.empty()){ break; } if(s.top()=='('){ s.pop(); break; }else{ cout<<s.top(); s.pop(); } } } } while(!s.empty()){ cout<<s.top(); s.pop(); } return 0; }