表达式计算递归模板

#include<bits/stdc++.h>
using namespace std;
string n;
int number(int left,int right){ //将字符串转化为数字
    int ans=0;
    for(int i=left;i<=right;i++){
        ans=ans*10+n[i]-'0';
    }
    return ans;
}
int cale(int l,int r){  //对某一个区间进行求值
    int cnt=0,add=0,mul=0,power=0;
    for(int i=l;i<=r;i++){  
//找出这个区间里面的最后一个+-或*/或^的位置,目的是把区间细分为更小的部分
        if(n[i]=='(')  cnt++;
        else if(n[i]==')')  cnt--;
        else if(!cnt){
            switch(n[i]){
                case '+':
                case '-':
                    add=i;
                case '*':
                case '/':
                    mul=i;
                case '^':
                    power=i;
            }
        }
    }
    if(cnt>0&&n[l]=='('){  //可能会输入多余的括号
        return cale(l+1,r);
    }
    else if(cnt<0&&n[r]==')'){
        return cale(l,r-1);
    }
    else if(!cnt&&!add&&!mul&&!power){ 
 //如果只是(123)或者123这种情况,也是最小的一种子情况了
        if(n[l]=='('&&n[r]==')'){
            return cale(l+1,r-1);
        }
        return number(l,r);
    }
//接下来就是细分区间了,转移成求更小的子区间的值
    if(add){
        if(n[add]=='+')  return cale(l,add-1)+cale(add+1,r);
        else  return cale(l,add-1)-cale(add+1,r);
    }
    if(mul){
        if(n[mul]=='*')  return cale(l,mul-1)*cale(mul+1,r);
        else  return cale(l,mul-1)/cale(mul+1,r);
    }
    if(power){
        return pow(cale(l,power-1),cale(power+1,r));
    }
}
int main(){
    cin>>n;
    cout<<cale(0,n.size()-1)<<endl;
    return 0;
}
全部评论

相关推荐

04-11 23:51
门头沟学院 Java
坚定的芭乐反对画饼_许愿Offer版:人人都能过要面试干嘛,发个美团问卷填一下,明天来上班不就好了
点赞 评论 收藏
分享
喜欢疯狂星期四的猫头鹰在研究求职打法:短作业优先
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务