import java.util.Stack;

/**
 * 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
 *
 * Note: Do not use the eval built-in library function.
 *
 * Tags: Stack, Math
 *
 * Similar Problems: (M) Evaluate Reverse Polish Notation, (M) Basic Calculator II, (M) Different Ways to Add
 * Parentheses, (H) Expression Add Operators
 */
public class BasicCalculator {

    public int calculate(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }

        int result = 0;
        int sign = 1; // sign of the current context
        int num = 0;

        Stack<Integer> stack = new Stack<>();
        stack.push(sign); // start with +1
        for (char c : s.toCharArray()) {
            if (c >= '0' && c <= '9') { // current number
                num = num * 10 + (c - '0');
            } else if (c == '+' || c == '-') { // number finishes
                result += sign * num;
                sign = stack.peek() * (c == '+' ? 1 : -1);
                num = 0;
            } else if (c == '(') { // sign outside of parantheses
                stack.push(sign);
            } else if (c == ')') {
                stack.pop();
            }
        }
        result += sign * num; // last number
        return result;
    }
}

add 224 Basic Calculator