← Back to Leo Academy Masterclass

Problem #224: Basic Calculator

Hard Stack

Intuition & Strategy Breakdown

Use a stack to process numbers, signs (+1 / -1), and parentheses. Evaluate sub-expressions inside brackets and accumulate total sum.

Python Solution

def calculate(s: str) -> int:
    stack = []
    current_number = 0
    result = 0
    sign = 1  # 1 for '+', -1 for '-'
    
    for char in s:
        if char.isdigit():
            # Build multi-digit numbers
            current_number = (current_number * 10) + int(char)
        elif char == '+':
            # Evaluate current term and set next sign to positive
            result += sign * current_number
            sign = 1
            current_number = 0
        elif char == '-':
            # Evaluate current term and set next sign to negative
            result += sign * current_number
            sign = -1
            current_number = 0
        elif char == '(':
            # Step through portal: Save current result and sign
            stack.append(result)
            stack.append(sign)
            # Reset for internal expression
            result = 0
            sign = 1
        elif char == ')':
            # Finish internal calculation
            result += sign * current_number
            # Pop sign and previous result to combine
            result *= stack.pop() # Pop sign
            result += stack.pop() # Pop prev_result
            current_number = 0
            
    return result + (sign * current_number)

Java Solution

class Solution {
    public int calculate(String s) {
        Stack stack = new Stack();
        int result = 0;
        int number = 0;
        int sign = 1;
        for(int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            if(Character.isDigit(c)){
                number = 10 * number + (int)(c - '0');
            }else if(c == '+'){
                result += sign * number;
                number = 0;
                sign = 1;
            }else if(c == '-'){
                result += sign * number;
                number = 0;
                sign = -1;
            }else if(c == '('){
                stack.push(result);
                stack.push(sign);
                result = 0;
                sign = 1;
            }else if(c == ')'){
                result += sign * number;
                number = 0;
                result *= stack.pop();
                result += stack.pop();
            }
        }
        if(number != 0) result += sign * number;
        return result;
    }
}
Watch Interactive Video on Leo Academy Main App