Basic Calculator I — Stack for Sign and Parentheses

Sanjeev SharmaSanjeev Sharma
2 min read

Advertisement

Problem 293 · Basic Calculator I

Difficulty: Hard · Pattern: Stack + Sign Tracking

Evaluate expression with +, -, and parentheses (no *, /).

Solutions

# Python
def calculate(s):
    stack = []
    result = 0; num = 0; sign = 1
    for c in s:
        if c.isdigit():
            num = num*10 + int(c)
        elif c == '+':
            result += sign * num; num = 0; sign = 1
        elif c == '-':
            result += sign * num; num = 0; sign = -1
        elif c == '(':
            # Save current result and sign
            stack.append(result); stack.append(sign)
            result = 0; sign = 1
        elif c == ')':
            result += sign * num; num = 0
            result *= stack.pop()   # multiply by sign before (
            result += stack.pop()   # add saved result before (
    result += sign * num
    return result
// Java
public int calculate(String s) {
    Deque<Integer> stack=new ArrayDeque<>();
    int result=0, num=0, sign=1;
    for (char c : s.toCharArray()) {
        if (Character.isDigit(c)) num=num*10+c-'0';
        else if (c=='+') { result+=sign*num; num=0; sign=1; }
        else if (c=='-') { result+=sign*num; num=0; sign=-1; }
        else if (c=='(') { stack.push(result); stack.push(sign); result=0; sign=1; }
        else if (c==')') { result+=sign*num; num=0; result*=stack.pop(); result+=stack.pop(); }
    }
    return result+sign*num;
}

Complexity

  • Time: O(n)
  • Space: O(n)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro