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 .
Example 1:
Input: "1 + 1" Output: 2
Example 2:
Input: " 2-1 + 2 " Output: 3
Example 3:
Input: "(1+(4+5+2)-3)+(6+8)" Output: 23
Note:
- You may assume that the given expression is always valid.
- Do not use the
eval
built-in library function.
class Solution(object): def calculate(self, s): """ :type s: str :rtype: int """ sign = 1 res = 0 stack = [] index = 0 while index < len(s): char = s[index] if char.isdigit(): num = int(char) while index + 1 < len(s) and s[index + 1].isdigit(): num = 10 * num + int(s[index + 1]) index += 1 res += sign * num elif char == '+': sign = 1 elif char == '-': sign = -1 elif char == '(': stack.append(res) stack.append(sign) res = 0 sign = 1 elif char == ')': res = stack.pop() * res + stack.pop() index += 1 return res
class Solution { public int calculate(String s) { char[] charArr = s.toCharArray(); LinkedList<Integer> stack = new LinkedList<>(); int sign = 1; int num = 0; for (int i = 0; i < charArr.length; i++) { char cur = charArr[i]; if (Character.isDigit(cur)) { int count = cur - '0'; while (i + 1 < charArr.length && Character.isDigit(charArr[i + 1])) { // need to use charArr[i + 1] count = 10 * count + charArr[i + 1] - '0'; i += 1; } num = num + count * sign; } else if (cur == '+') { sign = 1; } else if (cur == '-') { sign = -1; } else if (cur == '(') { stack.offerFirst(num); stack.offerFirst(sign); num = 0; sign = 1; } else if (cur == ')') { num = num * stack.pollFirst() + stack.pollFirst(); } } return num; } }