Skip to content

224. Basic Calculator

Problem:

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

Solutions:

public class Solution {
    public int calculate(String s) {
        Stack<Integer> nums = new Stack<Integer>();
        Stack<Character> ops = new Stack<Character>();
        for (int i = 0; i < s.length(); i ++) {
            char c = s.charAt(i);
            if (c == ' ') {
                continue;
            }
            if (c == '(') {
                nums.push(null);
                continue;
            }
            if (c == ')') {
                int count = nums.pop();
                nums.pop();
                nums.push(count);
                cal(nums, ops);
                continue;
            }
            if (c == '+' || c == '-') {
                ops.push(c);
                continue;
            }
            int j = i;
            int count = 0;
            while (j < s.length() && s.charAt(j) >= '0' && s.charAt(j) <= '9') {
                count = count * 10 + (s.charAt(j) - '0');
                j ++;
            }
            i = j - 1;
            nums.push(count);
            cal(nums, ops);
        }
        if (nums.isEmpty()) {
            return 0;
        }
        return nums.pop();
    }
    private void cal(Stack<Integer> nums, Stack<Character> ops) {
        if (nums.size() < 2 || ops.isEmpty()) {
            return;
        }
        Integer num2 = nums.pop();
        Integer num1 = nums.pop();
        if (num1 == null) {
            nums.push(num1);
            nums.push(num2);
            return;
        }
        char op = ops.pop();
        if (op == '+') {
            nums.push(num1 + num2);
            cal(nums, ops);
            return;
        }
        if (op == '-') {
            nums.push(num1 - num2);
            cal(nums, ops);
            return;
        }
    }
}
public class Solution {
    public int calculate(String s) {
        int res = 0, sign = 1;
        Stack<Integer> pre = new Stack<Integer>();
        for (int i = 0; i < s.length(); i ++) {
            char c = s.charAt(i);
            if (c == ' ') {
                continue;
            }
            if (c == '+') {
                sign = 1;
                continue;
            }
            if (c == '-') {
                sign = -1;
                continue;
            }
            if (c == '(') {
                pre.push(res);
                pre.push(sign);
                res = 0;
                sign = 1;
                continue;
            }
            if (c == ')') {
                res = res * pre.pop();
                res = pre.pop() + res;
                continue;
            }
            int count = 0;
            while (i < s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                count = count * 10 + (s.charAt(i) - '0');
                i ++;
            }
            i --;
            res = res + sign * count;
        }
        return res;
    }
}