给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()

 

示例 1:

输入:s = "1 + 1"
输出:2

示例 2:

输入:s = " 2-1 + 2 "
输出:3

示例 3:

输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23

 

提示:

  • 1 <= s.length <= 3 * 105
  • s 由数字、'+''-''('')'、和 ' ' 组成
  • s 表示一个有效的表达式
  • ‘+’ 不能用作一元运算(例如, “+1” 和 "+(2 + 3)" 无效)
  • ‘-‘ 可以用作一元运算(即 “-1” 和 "-(2 + 3)" 是有效的)
  • 输入中不存在两个连续的操作符
  • 每个数字和运行的计算将适合于一个有符号的 32位 整数
Related Topics
  • 递归
  • 数学
  • 字符串

  • 👍 782
  • 👎 0
  • 等于把括号去掉算出当前+,-符号真正对应的加减操作算出来

    class Solution {
        public int calculate(String s) {
            int res = 0;
            Stack<Integer> stack = new Stack<>();
            stack.push(1);
            int idx = -1;
            int flag = 1;
            while (++idx < s.length()){
                char c = s.charAt(idx);
                if (c == ' ')continue;
                switch (c){
                    case '+':
                        flag = stack.peek();
                        break;
                    case '-':
                        flag = -stack.peek();
                        break;
                    case '(':
                        stack.push(flag);
                        break;
                    case ')':
                        stack.pop();
                        break;
                    default:
                        //取到整个数字
                        int num = c - '0';
                        while (idx+1 < s.length() && s.charAt(idx+1) - '0'>=0 && s.charAt(idx+1)-'9'<=0){
                            idx++;
                            num *= 10;
                            num += s.charAt(idx) - '0';
                        }
                        //取到了整个数字
                        res += flag * num;
                        break;
                }
            }
            return res;
        }
    }

    写出来好像和官方题解一样?