225. Implement Stack using Queues
Question:
Implement a last in first out (LIFO) stack using only two queues. The implemented stack should support all the functions of a normal queue (push, top, pop, and empty).
Implement the MyStack class:- void push(int x) Pushes element x to the top of the stack.
- int pop() Removes the element on the top of the stack and returns it.
- int top() Returns the element on the top of the stack.
- boolean empty() Returns true if the stack is empty, false otherwise.
- You must use only standard operations of a queue, which means only push to back, peek/pop from front, size, and is empty operations are valid.
- Depending on your language, the queue may not be supported natively. You may simulate a queue using a list or deque (double-ended queue), as long as you use only a queue's standard operations.
Example:
Input
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
Output [null, null, null, 2, 2, false]
Explanation
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // return 2
myStack.pop(); // return 2
myStack.empty(); // return False
Follow-up: Can you implement the stack 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. You can use more than two queues.
Source code
Version 1
Idea: It's use one queue method.
Hence, let's back to push() implementation at this question. Call push()
to insert element in queue. Then, use loop to get the front's element and reinsert it into queue, and remove the front's element until the new element is at the front. So, the range of loop is from i = 1
to queue size
.
1 | class MyStack { |
Version 2
Idea:
It is use two queues and avoid using size()
q2 always stores a new elements. The elements in q1 are given by swap().
Before doing swap(), it should check wheather q1 is empty or not. If not, you should get the front's element at q1 and insert it into q2, and remove the front's element from q1.
The demonstration is shown as below:
1 | class MyStack { |