中缀转后缀

总结:

维护一个符号的栈,优先级大的可以压在优先级小的符号的上面。

  • 从左到右遍历
  • 数字直接输出
  • 左括号,直接压入堆栈,但是优先级最小(只有右括号可以弹出左括号)
  • 右括号,一直弹出运算符知道遇到左括号
  • 运算符,将优先级大于等于自己的弹出后再塞入
  • 结束后弹出所有运算符

代码:

/*
 *  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
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值