首页 > 其他 > 详细

leetcode 772 基本计算器III(包含+-*/ 以及括号) 核心在于递归

时间:2020-12-02 23:19:57      阅读:68      评论:0      收藏:0      [点我收藏+]

现基本计算器以计算简单表达式字符串。

表达式字符串可以包含左括号(和右括号)、加号+或减号、非负整数和空格。

表达式字符串只包含非负整数、+、-、*、/运算符、左括号和空格。整数除法应该截断为零。

您可以假定给定的表达式总是有效的。所有中间结果将在范围内[-2147483648,2147483647]

"1 + 1" = 2
" 6-4 / 2 " = 4
"2*(5+5*2)/3+(6/2+8)" = 21
"(2+6* 3+5- (3*14/7+2)*5)+3"=-12

 

class Solution {
public:
    int FindClosing(string s,int i){
        int level = 0,k=0;
        for(k=i;k<s.size()-1;k++){
            if(s[k] == () level++;
            if(s[k] == )) {
                if(--level == 0) return k;
            }
        }
        return k;
    }
    //带括号的话,用递归,更难一些(找到对应层级的括号并同时删除)
    int calculate(string s) {
        //利用栈: 3+5/2*3转化为 +3 +5 /2 *3
        stack<int> nums;
        int n = s.size();
        int num = 0,res =0,pre=0;
        char sign = +;
        for(int i=0;i<n;){
            //if(isspace(s[i])) continue; 忽略不用管空格
            if(isdigit(s[i])){
                num = num*10+(s[i]-0);
            }
            if(s[i] == (){
                //s的子串,找),剔除()
                int j = FindClosing(s,i);
                num = calculate(s.substr(i+1,j));
                i+=j;
            }
            if(!isspace(s[i]) && !isdigit(s[i]) || i == n-1){
                switch (sign){
                case +:
                    nums.push(num);
                    break;
                case -:
                    nums.push(-num);
                    break;
                case *:
                    pre=nums.top();
                    nums.pop();
                    nums.push(pre*num);
                    break;
                case /:
                    pre=nums.top();
                    nums.pop();
                    nums.push(pre/num);
                    break;
                }
                sign = s[i];
                num = 0;
            }
            i++;
        }
        while(!nums.empty()){
            res += nums.top();
            nums.pop();
        }
        return res;
    }
    
};

 

leetcode 772 基本计算器III(包含+-*/ 以及括号) 核心在于递归

原文:https://www.cnblogs.com/wsw-seu/p/14076223.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!