BackmediumStackMicrosoft

Evaluating Postfix Expressions Using Stack Solution

Problem Statement

Given a string that represents a postfix (Reverse Polish Notation) arithmetic expression, evaluate the expression and return its integer result. The expression contains only single‑digit non‑negative integers (0–9) and the four basic binary operators: addition (+), subtraction (−), multiplication (×), and integer division (÷). Division is performed as integer division that truncates toward zero. The input string is guaranteed to be a valid postfix expression and will never cause a division by zero. Your task is to compute the value of the expression using a stack‑based approach.

Input: A single line containing the postfix expression as a contiguous string of characters.

Output: A single integer, the evaluated result of the expression.

The algorithm should process the expression from left to right, pushing operands onto a stack and applying operators by popping the required operands, then pushing the result back onto the stack. After the entire string has been processed, the stack will contain exactly one element, which is the final answer.

Example 1
Input
231*+9-
Output
-4

Explanation: Process left to right: 1. Push 2, 3, 1. 2. Encounter '*': pop 1 and 3, compute 3*1=3, push 3. 3. Stack now [2,3]. 4. Encounter '+': pop 3 and 2, compute 2+3=5, push 5. 5. Stack now [5]. 6. Push 9. 7. Encounter '-': pop 9 and 5, compute 5-9=-4, push -4. 8. Final stack contains -4, which is the result.

Example 2
Input
12+34+*
Output
21

Explanation: Steps: 1. Push 1, 2. 2. '+': pop 2,1 → 1+2=3, push 3. 3. Push 3, 4. 4. '+': pop 4,3 → 3+4=7, push 7. 5. '*': pop 7,3 → 3*7=21, push 21. 6. Result 21.

Example 3
Input
82/3-
Output
1

Explanation: Process: 1. Push 8, 2. 2. '/': pop 2,8 → 8/2=4, push 4. 3. Push 3. 4. '-': pop 3,4 → 4-3=1, push 1. 5. Result 1.

Constraints

  • 1 <= expression.length <= 100000
  • All characters are either digits '0'–'9' or one of '+', '-', '*', '/'
  • The expression is syntactically correct and will not contain division by zero
  • The intermediate and final results fit within a 32‑bit signed integer
Live Compiler1 Free Run Available
Loading Editor...
Test Cases & Output
Click "Run" to test your 1 free compile trial!

🚀 Practice this problem

Run code, get AI hints & track streak

Sign Up Free

Evaluating Postfix Expressions Using Stack — Problem Statement & Solution Guide

StackMediumStack Processing
TimeO(n)
|
SpaceO(n)

Problem Description

Given a string that represents a postfix (Reverse Polish Notation) arithmetic expression, evaluate the expression and return its integer result. The expression contains only single‑digit non‑negative integers (0–9) and the four basic binary operators: addition (+), subtraction (−), multiplication (×), and integer division (÷). Division is performed as integer division that truncates toward zero. The input string is guaranteed to be a valid postfix expression and will never cause a division by zero. Your task is to compute the value of the expression using a stack‑based approach.

**Input**: A single line containing the postfix expression as a contiguous string of characters.

**Output**: A single integer, the evaluated result of the expression.

The algorithm should process the expression from left to right, pushing operands onto a stack and applying operators by popping the required operands, then pushing the result back onto the stack. After the entire string has been processed, the stack will contain exactly one element, which is the final answer.

DSA Pattern Breakdown

DSA Pattern Breakdown

"Evaluating Postfix Expressions Using Stack"

medium

WHY DOES IT MATTER?

The stack pattern guarantees correct operand ordering for binary operators without needing explicit precedence rules, making it essential for parsing expressions in compilers, calculators, and expression evaluators.

OPTIMIZATION CHALLENGE

Recognizing that each operator consumes two operands and produces one result reduces the stack size by one per operation, leading to O(n) space rather than O(n^2) if naive recursion were used.

REAL-WORLD CONNECTION

In distributed transaction systems, a stack‑like log of operations is used to roll back or commit changes; similarly, evaluating postfix expressions uses a stack to maintain intermediate states that can be undone or combined.

When presenting this solution, emphasize that the stack is a LIFO structure that naturally aligns with the postfix grammar, and that the algorithm’s linearity is a direct consequence of the expression’s linear scan.

COMPLEXITY AT A GLANCE

⏱ Time:O(n)
💾 Space:O(n)

Core Theory — Why This Approach?

Postfix (Reverse Polish Notation) expressions eliminate the need for parentheses by placing operators after their operands. The evaluation algorithm processes the expression left‑to‑right, pushing operands onto a stack and, upon encountering an operator, popping the required number of operands, applying the operation, and pushing the result back. This guarantees that at any point the stack contains exactly the intermediate results that are ready to be combined, ensuring linear time and constant auxiliary space beyond the stack itself.

A naive approach might attempt to parse the expression recursively or repeatedly scan the string to find matching operands, leading to quadratic time and excessive recursion depth for long inputs. Such methods also struggle with operator precedence and associativity, which are inherently handled by the postfix format. The stack paradigm is optimal because it maps directly to the evaluation order, uses only O(n) time (each character processed once) and O(n) space for the stack, and is straightforward to implement in any language.

Moreover, integer division truncating toward zero is naturally handled by the language’s integer division operator, and the algorithm’s simplicity makes it robust against overflow when using 64‑bit integers. The stack approach also lends itself to parallelization in distributed systems where partial results can be combined in a tree‑like fashion, mirroring the associative nature of the operations.

Interview Questions on This Problem

Q1How would you modify the algorithm to support multi‑digit numbers and whitespace separators in the postfix expression?

First, tokenize the input string by splitting on whitespace or using a scanner that recognizes digits. Then, push each numeric token onto the stack as an integer. When an operator token is encountered, pop the required operands, perform the operation, and push the result back. This preserves the stack logic while handling arbitrary integer sizes.

Q2In a distributed microservices architecture, how could you evaluate a large postfix expression that is split across multiple services?

Treat each service as a worker that evaluates a sub‑expression and returns its result. Use a hierarchical reduction: leaf services compute small postfix segments, intermediate services combine results by applying operators, and the root service aggregates the final value. This mirrors a binary tree reduction and keeps each service’s stack size bounded.

Q3What edge cases must you consider when implementing integer division in a language that truncates toward zero versus toward negative infinity?

Ensure that the division operation explicitly truncates toward zero, e.g., by using the language’s built‑in integer division or by casting to a signed integer type. Test cases with negative operands (if allowed) and zero divisors should be handled to avoid runtime errors or incorrect truncation.

Examples

Example 1

Input

231*+9-

Output

-4

Explanation: Process left to right: 1. Push 2, 3, 1. 2. Encounter '*': pop 1 and 3, compute 3*1=3, push 3. 3. Stack now [2,3]. 4. Encounter '+': pop 3 and 2, compute 2+3=5, push 5. 5. Stack now [5]. 6. Push 9. 7. Encounter '-': pop 9 and 5, compute 5-9=-4, push -4. 8. Final stack contains -4, which is the result.

Example 2

Input

12+34+*

Output

21

Explanation: Steps: 1. Push 1, 2. 2. '+': pop 2,1 → 1+2=3, push 3. 3. Push 3, 4. 4. '+': pop 4,3 → 3+4=7, push 7. 5. '*': pop 7,3 → 3*7=21, push 21. 6. Result 21.

Example 3

Input

82/3-

Output

1

Explanation: Process: 1. Push 8, 2. 2. '/': pop 2,8 → 8/2=4, push 4. 3. Push 3. 4. '-': pop 3,4 → 4-3=1, push 1. 5. Result 1.

Constraints

  • 1 <= expression.length <= 100000
  • All characters are either digits '0'–'9' or one of '+', '-', '*', '/'
  • The expression is syntactically correct and will not contain division by zero
  • The intermediate and final results fit within a 32‑bit signed integer

Optimal Approach & Strategy

Use a single pass with a stack: push digits, pop two operands for each operator, compute, push result. This runs in linear time and uses linear space for the stack.

Brute Force Approach

A naive method might recursively parse the string, repeatedly scanning for operands and operators, leading to quadratic time and deep recursion for long expressions.

Verified Code Solutions

JavaScript Solution
Time: O(n)
function solution(expression) {
   let stack = [];
   let output = 0;
   for (let i = 0; i < expression.length; i++) {
      if (!isNaN(expression[i])) {
         stack.push(parseInt(expression[i]));
      } else {
         if (stack.length < 2) {
            throw new Error('Invalid expression');
         }
         let operand2 = stack.pop();
         let operand1 = stack.pop();
         switch (expression[i]) {
            case '+':
               stack.push(operand1 + operand2);
               break;
            case '-':
               stack.push(operand1 - operand2);
               break;
            case '*':
               stack.push(operand1 * operand2);
               break;
            case '/':
               if (operand2 === 0) {
                  throw new Error('Division by zero');
               }
               stack.push(Math.floor(operand1 / operand2));
               break;
         }
      }
   }
   if (stack.length !== 1) {
      throw new Error('Invalid expression');
   }
   return stack[0];
}

Asked in Top Tech Interviews

Microsoft

Solve in Interative Editor

Ready to test your code? Open our built-in compiler, run custom test suites, and see detailed complexity analysis reports instantly.