Leetcode 224-基本计算器

先做Leetcode 227再做本题

本题在227的基础上多了括号

题解

关于括号的递归调用思想请参考labuladong

将 减法、乘法、除法 转换为 加法

某个数 num, 如果前面的对应的运算符是 -,那么 将 -num 压入栈中

这样,我们只需在最后将栈的元素全部弹出,完成加法操作,即可得到最终结果

对于括号,它存在递归性质

3 * (2 + 4 * 3) + 2

= 3 * calculate(2 + 4 * 3) + 2

= 3 * 24 + 2

即我们可以将括号内的字符串当作一个运算式,再递归调用本函数,最终返回一个数值

bash 复制代码
class Solution {
    int i=0;
    public int calculate(String s) {
        return calHelper(s);
    }

    public int calHelper(String s){
        //数字num是和已有的运算符sign做计算
        Stack<Integer> nums=new Stack<>();
        //Stack<Character> ops=new Stack<>();
        char[] str=s.toCharArray();
        //对于第一个数字,其之前的运算符视为加号
        char preSign = '+';
        //记录当前数字大小
        int num=0;

        for(;i<str.length;i++){
            char c=str[i];
            //1.是数字
            if(c>='0'&&c<='9'){
                num=num*10+(c-'0');
            }
            // 2、如果为左括号,从左括号的下一个字符开始递归
            else if(c == '(') { 
                i++;
                num = calHelper(s);
            }
            //3.是符号或者遍历到了字符串末尾
            if(!Character.isDigit(c) && s.charAt(i) != ' '||i == str.length-1){
                switch(preSign){
                    case '+':
                    nums.push(num);break;
                    case '-':
                    nums.push(-num);break;
                    case '*':
                    nums.push(nums.pop()*num);break;
                    case '/':
                    nums.push(nums.pop()/num);break;
                }
                // 更新符号为当前符号,数字清零
                preSign=c;
                num=0;
            }
            // 4、如果为右括号,结束递归(返回后,i指向新生成的数字)
            if(c == ')') {
                //i++; 
                break;
            }
        }
        // 将栈中所有结果求和就是答案
        int res = 0;
        while (!nums.isEmpty()) {
            res += nums.pop();
        }
        return res;
    }
}
相关推荐
M78佐菲35 分钟前
Linux学习笔记:进程回收、exec函数簇与线程
linux·笔记·学习·算法
linux-hzh37 分钟前
百日算法修炼 · Day 18
算法
用户8132679332539 分钟前
Python 计算盘中 VWAP:为什么 1 分钟 K 线是量化工程中的高性价比选择
后端·算法·github
高频因子挖掘机43 分钟前
Python批量获取1000只ETF 5分钟K线:从分页到吞吐量优化的QuantDash实践
后端·算法·github
额额额对了1 小时前
Linux C 多线程编程基础:从内存模型到生命周期管理
linux·开发语言·算法
INGNIGHT2 小时前
1584.连接所有点的最小费用(最小生成树&并查集union find)
c++·leetcode
wabs6662 小时前
关于二叉树【力扣144.二叉树的前序遍历的思考】
数据结构·c++·算法·leetcode·二叉树
郝学胜-神的一滴2 小时前
C++20 高级编程 004:从初始化、内存到const系列关键字
开发语言·算法·编程·软件构建·c++20
kyle~2 小时前
点云配准--- 迭代最近点 ICP 求解
线性代数·算法·机器学习
qq7422349842 小时前
Gradio 极简入门:三分钟为AI模型打造交互界面,并对比Streamlit与Dash如何选型
人工智能·算法·大模型·交互·dash