[LC] 224. Basic Calculator

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;
    }
}

 

posted @ 2019-11-10 00:42  xuan_abc  阅读(114)  评论(0编辑  收藏  举报