Evaluate Postfix Expression Using Stack in DSA Python - Time & Space Complexity
We want to understand how the time taken to evaluate a postfix expression changes as the expression gets longer.
Specifically, how does the number of steps grow when we use a stack to solve this?
Analyze the time complexity of the following code snippet.
def evaluate_postfix(expression):
stack = []
for char in expression:
if char.isdigit():
stack.append(int(char))
else:
right = stack.pop()
left = stack.pop()
if char == '+':
stack.append(left + right)
elif char == '*':
stack.append(left * right)
return stack.pop()
This code evaluates a postfix expression with single-digit numbers and '+' or '*' operators using a stack.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Looping through each character in the expression once.
- How many times: Exactly once for each character in the input expression.
Each character in the expression is processed once, so the steps grow directly with the length of the expression.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 steps |
| 100 | About 100 steps |
| 1000 | About 1000 steps |
Pattern observation: The number of operations increases in a straight line as the input size grows.
Time Complexity: O(n)
This means the time to evaluate grows directly in proportion to the length of the postfix expression.
[X] Wrong: "Evaluating postfix expressions takes more than linear time because of the stack operations."
[OK] Correct: Each character is handled once, and stack operations (push/pop) are very fast and happen only once per character, so overall time stays linear.
Understanding this linear time behavior helps you explain how stacks efficiently solve expression evaluation problems, a common topic in interviews.
"What if the expression contained multi-digit numbers separated by spaces? How would the time complexity change?"
Practice
Solution
Step 1: Understand postfix evaluation process
In postfix evaluation, operands are pushed onto a stack. When an operator is encountered, two operands are popped, the operation is applied, and the result is pushed back.Step 2: Identify correct method
Pushing operands onto the stack and popping two operands for each operator to apply the operation correctly describes this stack-based process. Other options describe unrelated or incorrect methods.Final Answer:
Pushing operands onto the stack and popping two operands for each operator to apply the operation -> Option CQuick Check:
Postfix evaluation uses stack push/pop [OK]
- Thinking postfix needs conversion to infix first
- Trying to evaluate from left to right without stack
- Ignoring the order of operands when popping
Solution
Step 1: Check correct stack operations
In Python, list's append() adds elements (push), pop() removes last element (pop). For postfix, push operands as integers, pop two for operator.Step 2: Match with options
stack.append(int(char)) when char is digit; pop two, apply operator, push result correctly uses stack.append(int(char)) for digits and pops two operands for operators. Others misuse push/pop or skip stack.Final Answer:
stack.append(int(char)) when char is digit; pop two, apply operator, push result -> Option AQuick Check:
Use append to push, pop to remove [OK]
- Using stack.push() which is not a Python list method
- Popping only one operand for operator
- Not converting char to int before pushing
'231*+9-'?
def evaluate_postfix(expr):
stack = []
for char in expr:
if char.isdigit():
stack.append(int(char))
else:
b = stack.pop()
a = stack.pop()
if char == '+':
stack.append(a + b)
elif char == '-':
stack.append(a - b)
elif char == '*':
stack.append(a * b)
elif char == '/':
stack.append(a // b)
return stack.pop()
print(evaluate_postfix('231*+9-'))Solution
Step 1: Evaluate expression step-by-step
Expression: '2 3 1 * + 9 -' - Push 2, 3, 1 - '*' operator: pop 1 and 3, multiply 3*1=3, push 3 - '+' operator: pop 3 and 2, add 2+3=5, push 5 - Push 9 - '-' operator: pop 9 and 5, subtract 5-9=-4, push -4Step 2: Final result
Pop final value from stack: -4Final Answer:
-4 -> Option AQuick Check:
Postfix '231*+9-' = -4 [OK]
- Mixing operand order when popping (a, b vs b, a)
- Using float division instead of integer division
- Misreading the expression order
def eval_postfix(expr):
stack = []
for char in expr:
if char.isdigit():
stack.append(char)
else:
a = stack.pop()
b = stack.pop()
if char == '+':
stack.append(a + b)
elif char == '-':
stack.append(a - b)
return stack.pop()
print(eval_postfix('23+'))Solution
Step 1: Identify error cause
The code pushes characters as strings onto stack. When popping, it tries to add strings, causing TypeError.Step 2: Fix by converting to int
Convert char to int before pushing: stack.append(int(char)) to allow arithmetic operations.Final Answer:
TypeError due to adding strings; fix by converting char to int before pushing -> Option BQuick Check:
Push integers, not strings, to avoid TypeError [OK]
- Pushing strings instead of integers
- Swapping operand order when popping
- Ignoring operator cases other than '+' and '-'
'56+82/-', what is the result after evaluating it using a stack? Show the step-by-step evaluation.Solution
Step 1: Evaluate postfix expression stepwise
Expression: '5 6 + 8 2 / -' - Push 5, 6 - '+' operator: pop 6 and 5, add 5+6=11, push 11 - Push 8, 2 - '/' operator: pop 2 and 8, integer divide 8//2=4, push 4 - '-' operator: pop 4 and 11, subtract 11-4=7, push 7Step 2: Final result
Pop final value from stack: 7Final Answer:
7 -> Option DQuick Check:
Postfix '56+82/-' = 7 [OK]
- Dividing operands in wrong order (2/8 instead of 8/2)
- Using float division instead of integer division
- Mixing operand order when subtracting
Ready to prove it?
Pass the test and this pattern moves unknown
