总结:
维护一个符号的栈,优先级大的可以压在优先级小的符号的上面。
- 从左到右遍历
- 数字直接输出
- 左括号,直接压入堆栈,但是优先级最小(只有右括号可以弹出左括号)
- 右括号,一直弹出运算符知道遇到左括号
- 运算符,将优先级大于等于自己的弹出后再塞入
- 结束后弹出所有运算符
代码:
/*
* Author : Jk_Chen
* Date : 2020-08-25-19.43.35
*/
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define LD long double
#define rep(i,a,b) for(int i=(int)(a);i<=(int)(b);i++)
#define per(i,a,b) for(int i=(int)(a);i>=(int)(b);i--)
#define mmm(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define pill pair<int, int>
#define fi first
#define se second
void test(){cerr<<"\n";}
template<typename T,typename... Args>void test(T x,Args... args){cerr<<"> "<<x<<" ";test(args...);}
const LL mod=1e9+7;
const int maxn=1e5+9;
const int inf=0x3f3f3f3f;
LL rd(){ LL ans=0; char last=' ',ch=getchar();
while(!(ch>='0' && ch<='9'))last=ch,ch=getchar();
while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
if(last=='-')ans=-ans; return ans;
}
#define rd rd()
/*_________________________________________________________begin*/
int cnt;
struct node{
int val;
char op;
bool isOp;
}e[maxn];
stack<char>S;
int Pri(char op,bool inStack){
if(op=='('){
if(inStack)return 0;
else return 3;
}
if(op=='*'||op=='/')return 2;
if(op=='+'||op=='-')return 1;
}
void PushNum(int val){
e[++cnt].isOp=0;
e[cnt].val=val;
}
void PushOp(char op){
if(op!=')'){
while(!S.empty()&&Pri(op,0)<=Pri(S.top(),1)){
e[++cnt].isOp=1;
e[cnt].op=S.top();
S.pop();
}
S.push(op);
}
else{
while(S.top()!='('){
e[++cnt].isOp=1;
e[cnt].op=S.top();
S.pop();
}
S.pop();
}
}
int main(){
char x[20];
while(scanf("%s",x)!=EOF){
if(isdigit(x[0])){
int len=strlen(x);
int val=0;
rep(i,0,len-1){
val=val*10+x[i]-'0';
}
PushNum(val);
}
else{
PushOp(x[0]);
}
}
while(!S.empty()){
e[++cnt].isOp=1;
e[cnt].op=S.top();
S.pop();
}
rep(i,1,cnt){
if(e[i].isOp){
cout<<e[i].op<<" ";
}
else{
cout<<e[i].val<<" ";
}
}
puts("");
}
/*
7 - 3 * 2 + 9 / 2
7 * ( 2 + 3 / ( 4 * 5 + 2 ) ) / 3 + 2
*/