# 「力扣」第 224 题:基本计算器

读到符号看栈顶,读到数字看符号(已经看过栈顶的信息了)。

  • 强调题意
    • 只有数字、加减、括号、空格
    • 强调一下「提示」的内容

  • 思路分析

    • 主要目的是「去括号」;
    • 每个数字最终的符号,由「它前面的符号」以及「它前面的左括号前的符号」共同决定。括号的影响,从左括号开始,到与之配对的右括号结束。
  • 下面我们一点一点拆分解决这个问题:

    • 处理 2 位以及 2 位以上的数字:

    • 处理空格:跳过

    • 第一,如果没有括号,没有空格,如果全是「+」,是不是很简单;

    • 第二,如果没有括号,没有空格,如果全是「+、-」,需要知道之前看到的是「正号、还是负号」,设置变量 sign

    • 第三,再复杂一点,有括号。看到数字、符号、以及前面的括号,就可以把括号拆掉。有几层括号,以及括号前面的正负号,决定了当前这个数的正负号。

  • 典型例子1-(4-5-(1+3-(2-1-(1+8))))-(1+2)

# 方法:栈

class Solution {

    public int calculate(String s) {
        int len = s.length();

        int res = 0;
        int sign = 1;
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        for (int i = 0; i < len; i++) {
            if (s.charAt(i) == ' ') {
                continue;
            } else if (s.charAt(i) == '+') {
                sign = stack.peek();
            } else if (s.charAt(i) == '-') {
                sign = -stack.peek();
            } else if (s.charAt(i) == '(') {
                stack.push(sign);
            } else if (s.charAt(i) == ')') {
                stack.pop();
            } else {
                int num = 0;
                while (i < len && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    num = 10 * num + s.charAt(i) - '0';
                    i++;
                }
                i--;

                res += sign * num;
            }
        }
        return res;
    }
}

作者:liweiwei1419 链接:https://suanfa8.com/stack/solutions-1/0224-basic-calculator 来源:算法吧 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Last Updated: 11/19/2024, 1:33:17 AM