Implement Queue using Stacks
Problem Statement
Implement a queue using two stacks. The queue should support push, pop, peek, and empty operations.
Example: push(1), push(2), pop() → returns 1
Approach 1: Brute Force
Explanation: On push, move all elements to auxiliary stack, insert, and restore order.
Time Complexity: push O(n), pop O(1)
Space Complexity: O(n)
stack1 = empty stack2 = empty push(x): while stack1 not empty: stack2.push(stack1.pop()) stack1.push(x) while stack2 not empty: stack1.push(stack2.pop()) pop(): return stack1.pop() peek(): return stack1.top() empty(): return stack1 is empty
Approach 2: Lazy Transfer (Better)
Explanation: Push into stack1; pop/peek from stack2; transfer only when stack2 empty.
Time Complexity: Amortized O(1) per operation
Space Complexity: O(n)
stack1 = empty stack2 = empty push(x): stack1.push(x) pop(): if stack2 empty: while stack1 not empty: stack2.push(stack1.pop()) return stack2.pop() peek(): similar to pop but return stack2.top() empty(): return stack1 empty and stack2 empty
Approach 3: Recursive Pop (Alternative)
Explanation: Use recursion to reverse stack1 temporarily during pop.
Time Complexity: O(n) per pop
Space Complexity: O(n) recursion stack
push(x): stack1.push(x) pop(): if stack1 size == 1: return stack1.pop() temp = stack1.pop() res = pop() stack1.push(temp) return res peek(): similar, but return last element instead of popping empty(): stack1 empty