224 Basic Calculator

1. Question

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open(and closing parentheses), the plus+or minus sign-, non-negative integers and empty spaces.

You may assume that the given expression is always valid.

Some examples:

"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23

2. Implementation

(1) Stack

思路:由于这题只有括号和加减两种运算,因此我们只需要一个stack,处理括号内的运算。我们用sign这个变量表示当前数字的正负,遇到加号时,sign是1,负号时,sign是-1。当我们遇到左括号时,说明有新的运算要运行,所以先将之前的运算结果res存入stack,然后也将sign存入stack。遇到右括号时,则说明括号内的运算结束,得到结果res后,将res乘以stack顶的符号,然后加上stack顶的数字

class Solution {
    int i = 0;
    public int calculate(String s) {
        Stack<Integer> stack = new Stack();
        int val = 0;
        int res = 0;
        int sign = 1;
        int n = s.length();

        int i = 0;

        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) {
                val = 10 * val + c - '0';
            }
            else if (c == '+' || c == '-') {
                res += val * sign;
                val = 0;
                sign = c == '+' ? 1 : -1;
            }
            else if (c == '(') {
                stack.push(res);
                stack.push(sign);
                sign = 1;
                res = 0;
            }
            else if (c == ')') {
                res += val * sign;
                val = 0;
                // multiply sign
                res *= stack.pop();
                // add val 
                res += stack.pop();
            }
        }
        res += val * sign;
        return res;
    }
}

(2) Recursion

思路:recursion的思路比较明了,在括号内的运算其实是一个subproblem,所以我们维护一个全局变量i,表示当前在string的位置,遇到左括号时,则递归地call calculate这个function,遇到右括号时,将计算res,将res返回

class Solution {
    int i = 0;
    public int calculate(String s) {
        int sign = 1;
        int val = 0;
        int res = 0;
        int n = s.length();

        while (i < n) {
            char c = s.charAt(i);
            ++i;

            if (Character.isDigit(c)) {
                val = 10 * val + c - '0';
            }
            else if (c == '+' || c == '-') {
                res += val * sign;
                val = 0;
                sign = c == '+' ? 1 : -1;
            }
            else if (c == '(') {
                val = calculate(s);
            }
            else if (c == ')') {
                res += val * sign;
                return res;
            }
        }
        res += val * sign;
        return res;
    }
}

3. Time & Space Complexity

(1) Stack: 时间和空间复杂度都是O(n)

(2) Recursion: 时间复杂度O(n), 空间复杂度O(n)

Last updated

Was this helpful?