leetcode 224. 基本计算器

@(labuladong的算法小抄)[计算器]

leetcode 224. 基本计算器

题目描述

在这里插入图片描述

解题思路

参考:labuladong的算法小抄P328

class Solution {
    public int calculate(String s) {
        Queue<Character> q = new LinkedList<>();
        /* 初始化队列,将字符串的表达式存到队列中 */
        for (int i = 0; i < s.length(); i++) {
            q.offer(s.charAt(i));
        }
        return calculate(q);
    }

    /* 计算队列q中表达式的值 */
    private int calculate(Queue<Character> q) {
        /* 将s中的每个数字和它前面对应的符号存入栈中,最后对栈求和 */
        Stack<Integer> stk = new Stack<>();
        /* 记录表达式中的每个数字 */
        int num = 0;
        /* 记录num前的符号,初始化为+ */
        char sign = '+';

        while (!q.isEmpty()) {
            char c = q.poll();
            /* 将一对括号内的表达式看成一个数字 */
            /* 遇到左括号则开始递归,直到遇到右括号,计算括号内表达式的值,返回给num */
            if (c == '(') {
                num = calculate(q);
            }

            /* 如果是数字,则连续读取(因为有可能是458这种三位数) */
            if (Character.isDigit(c)) {
                num = num * 10 + (c - '0');
            }
            /* 如果不是数字,且不是空格,或者当队列空了,则需要将num拼接上它的符号入栈 */
            if ((!Character.isDigit(c) && c != ' ') || q.isEmpty()) {
                switch (sign) {
                    case '+':
                        stk.push(num);
                        break;
                    case '-':
                        stk.push(-num);
                        break;
                }
                /* 更新符号sign为当前指向的符号,并把num清零 */
                sign = c;
                num = 0;
            }
            /* 注意,右括号的处理要写在这里! */
            /* 因为在遇到右括号需要退出时,要把右括号之前最后的num入栈 */
            if (c == ')') break;
        }
        /* 将栈中的所有元素求和就是答案 */
        int res = 0;
        while (!stk.isEmpty()) {
            res += stk.pop();
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值