Problem Statement
Implement a first in first out (FIFO) queue using only two stacks.
The implemented queue should support all the functions of a normal
queue (push
, peek
, pop
, and empty
).
Implement the MyQueue
class:
void push(int x)
Pushes element x to the back of the queue.
int pop()
Removes the element from the front of the queue and returns it.
int peek()
Returns the element at the front of the queue.
boolean empty()
Returns true
if the queue is empty, false
otherwise.
Notes:
- You must use only standard operations of a stack, which means only
push to top
,peek/pop from top
,size
, andis empty
operations are valid. - Depending on your language, the stack may not be supported natively. You may simulate a stack using a list or deque (double-ended queue) as long as you use only a stack's standard operations.
Example 1:
Input:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
Output:
[null, null, null, 1, 1, false]
Explanation:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false
Constraints:
1 <= x <= 9
- At most
100
calls will be made topush
,pop
,peek
, andempty
. - All the calls to
pop
andpeek
are valid.
Follow Up
Can you implement the queue such that each operation is amortized
O(1)
time complexity? In other words, performing n
operations will take
overall O(n)
time even if one of those operations may take longer.
Explanation
Properties of Queue:
Properties of Stack:
Inorder to create queue using stack, we can use combination of 2 stacks (say stack1
, stack2
);
Queue: Push
- push new element to
stack1
- oldest element pushed will be in the bottom of stack
- newest element pushed will be on the top of stack
Queue: Peek
- IF
stack2
is empty then oldest element will be at the bottom ofstack1
else oldest element will be on top ofstack2
IF stack2 is empty
WHILE stack1 is not empty
pop element from stack1
push element into stack2
- Now, oldest element will always be on the top of
stack2
Queue: Pop
- same as finding the peek, then just pop peek element from
stack2
. - after, pop operation on
stack2
, 2nd oldest will again come on top ofstack2
.
Solution
- C++ Two User Stack
class MyQueue {
private:
stack<int> s1, s2;
public:
MyQueue() {
}
void push(int x) {
s1.push(x);
}
int pop() {
if(s2.empty()) {
while(!s1.empty()) {
s2.push(s1.top());
s1.pop();
}
}
int ans = s2.top();
s2.pop();
return ans;
}
int peek() {
if(s2.empty()) {
while(!s1.empty()) {
s2.push(s1.top());
s1.pop();
}
}
return s2.top();
}
bool empty() {
return s1.size() + s2.size() == 0;
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue* obj = new MyQueue();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->empty();
*/
Time Complexity:
- Push: O(1)
- Pop: O(N), amortized: O(1)
- Peek: O(N), amortized: O(1)
Space Complexity: O(N)