# 225. Implement Stack using Queues - LeetCode Best Practices Visit original link: [225. Implement Stack using Queues - LeetCode Best Practices](https://leetcoder.net/en/leetcode/225-implement-stack-using-queues) for a better experience! LeetCode link: [225. Implement Stack using Queues](https://leetcode.com/problems/implement-stack-using-queues), difficulty: **Easy**. ## LeetCode description of "225. Implement Stack using Queues" Implement a last-in-first-out (LIFO) stack using only two queues. The implemented stack should support all the functions of a normal stack (`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. **Notes**: - You must use **only** standard operations of a queue, which means that 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 1] **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

### [Constraints] - `1 <= x <= 9` - At most `100` calls will be made to `push`, `pop`, `top`, and `empty`. - All the calls to `pop` and `top` are valid. **Follow-up**: Can you implement the stack using only one queue? ## Intuition 1 1. Two queues are used, one for input and output, and the other for temporary storage. 2. There are two options for using queues to simulate the functions of a stack: 1. Option 1: Simplify the `pop()` and `top()` operations and complicate the `push(x)` operation. When `push(x)`, you need to insert `x` into the front of the queue with effort. 2. Option 2: Simplify the `push(x)` operation and complicate the `pop()` and `top()` operations. When `pop()` or `top()`, you need to find the last data with effort. 3. Advantages of Option 1: Less code, because it only needs to complicate one method, while Solution 2 complicates two methods; easier to understand logically because it sorts the data in the queue according to the `last in, first out` rule. ## Complexity - Time complexity: `push O(n), pop O(1), top O(1), empty O(1)`. - Space complexity: `O(n)`. ## Python ```python class MyStack: def __init__(self): self.queue = deque() self.queue_temp = deque() def push(self, x: int) -> None: # Move all 'queue' items to 'queue_temp'. while self.queue: self.queue_temp.append( self.queue.popleft() ) # Emplaced 'x' at the first of 'queue' because 'queue' is empty. self.queue.append(x) # Move all 'queue_temp' items back to 'queue'. while self.queue_temp: self.queue.append( self.queue_temp.popleft() ) def pop(self) -> int: return self.queue.popleft() def top(self) -> int: return self.queue[0] def empty(self) -> bool: return not self.queue ``` ## C++ ```cpp class MyStack { private: queue queue_; queue queue_temp_; public: MyStack() {} void push(int x) { // Step 1: Move all existing elements from main queue_ to temp_queue_ while (!queue_.empty()) { queue_temp_.push(queue_.front()); queue_.pop(); } // Step 2: Add the new element to the now-empty main queue_ // This ensures the newest element is at the front (LIFO behavior) queue_.push(x); // Step 3: Move all elements from temp_queue_ back to main queue_ // This places all previous elements behind the new element while (!queue_temp_.empty()) { queue_.push(queue_temp_.front()); queue_temp_.pop(); } } int pop() { int val = queue_.front(); queue_.pop(); return val; } int top() { return queue_.front(); } bool empty() { return queue_.empty(); } }; ``` ## Go ```go type MyStack struct { // Main queue that stores elements in stack order queue []int // Temporary queue used during push operations queueTemp []int } func Constructor() MyStack { return MyStack{ queue: []int{}, queueTemp: []int{}, } } func (this *MyStack) Push(x int) { // Step 1: Move all existing elements from main queue to temp queue for len(this.queue) > 0 { // Remove from front and add to temp queue this.queueTemp = append(this.queueTemp, this.queue[0]) this.queue = this.queue[1:] } // Step 2: Add the new element to the now-empty main queue // This ensures the newest element is at the front (LIFO behavior) this.queue = append(this.queue, x) // Step 3: Move all elements from temp queue back to main queue // This places all previous elements behind the new element for len(this.queueTemp) > 0 { // Remove from front and add to main queue this.queue = append(this.queue, this.queueTemp[0]) this.queueTemp = this.queueTemp[1:] } } func (this *MyStack) Pop() int { val := this.queue[0] this.queue = this.queue[1:] return val } func (this *MyStack) Top() int { return this.queue[0] } func (this *MyStack) Empty() bool { return len(this.queue) == 0 } ``` ## Ruby ```ruby class MyStack def initialize @queue = [] # Main queue that stores elements in stack order @queue_temp = [] # Temporary queue used during push operations end def push(x) # Step 1: Move all existing elements from main queue to temp queue while !@queue.empty? @queue_temp.push(@queue.shift) end # Step 2: Add the new element to the now-empty main queue # This ensures the newest element is at the front (LIFO behavior) @queue.push(x) # Step 3: Move all elements from temp queue back to main queue # This places all previous elements behind the new element while !@queue_temp.empty? @queue.push(@queue_temp.shift) end end def pop @queue.shift end def top @queue.first end def empty @queue.empty? end end ``` ## JavaScript ```javascript var MyStack = function () { this.queue = [] this.queueTemp = [] }; MyStack.prototype.push = function (x) { while (this.queue.length > 0) { this.queueTemp.push( this.queue.shift() // remove from head ) } this.queue.push(x) while (this.queueTemp.length > 0) { this.queue.push( this.queueTemp.shift() // remove from head ) } }; MyStack.prototype.pop = function () { return this.queue.shift() // remove from head }; MyStack.prototype.top = function () { return this.queue[0] }; MyStack.prototype.empty = function () { return this.queue.length === 0 }; ``` ## Java ```java class MyStack { private Queue queue; private Queue queueTemp; public MyStack() { queue = new LinkedList<>(); // main queue queueTemp = new LinkedList<>(); } public void push(int x) { // Move all elements from main queue to temporary queue while (!queue.isEmpty()) { queueTemp.offer( queue.poll() // Remove from front (standard queue operation) ); } // Add the new element to the now-empty main queue // This will be the first element to be removed (stack's top) queue.offer(x); // Move all elements back from temporary queue to main queue // This ensures newest elements are at the front of the queue while (!queueTemp.isEmpty()) { queue.offer( queueTemp.poll() // Remove from front (standard queue operation) ); } } public int pop() { return queue.poll(); } public int top() { return queue.peek(); } public boolean empty() { return queue.isEmpty(); } } ``` ## C# ```csharp public class MyStack { private Queue queue; // main queue private Queue queueTemp; public MyStack() { queue = new Queue(); queueTemp = new Queue(); } public void Push(int x) { // Move all elements from main queue to temporary queue while (queue.Count > 0) { queueTemp.Enqueue( queue.Dequeue() ); } // Add the new element to the now-empty main queue // This will be the first element to be removed (stack's top) queue.Enqueue(x); // Move all elements back from temporary queue to main queue // This ensures newest elements are at the front of the queue while (queueTemp.Count > 0) { queue.Enqueue( queueTemp.Dequeue() ); } } public int Pop() { return queue.Dequeue(); } public int Top() { return queue.Peek(); } public bool Empty() { return queue.Count == 0; } } ``` ## Other languages ```java // Welcome to create a PR to complete the code of this language, thanks! ``` ## Intuition 2 1. Two queues are used, one for input and output, and the other for temporary storage. 2. There are two options for using queues to simulate the functions of a stack: 1. Option 1: Simplify the `pop()` and `top()` operations and complicate the `push(x)` operation. When `push(x)`, you need to insert `x` into the front of the queue with effort. 2. Option 2: Simplify the `push(x)` operation and complicate the `pop()` and `top()` operations. When `pop()` or `top()`, you need to find the last data with effort. 3. This article mainly introduces `Option 2` to facilitate readers to compare the two solutions. ## Complexity - Time complexity: `push O(1), pop O(n), top O(n), empty O(1)`. - Space complexity: `O(n)`. ## Python ```python class MyStack: def __init__(self): self.queue = deque() self.queue_temp = deque() def push(self, x: int) -> None: self.queue.append(x) def pop(self) -> int: while len(self.queue) > 1: self.queue_temp.append( self.queue.popleft() ) value = self.queue.popleft() while self.queue_temp: self.queue.append( self.queue_temp.popleft() ) return value def top(self) -> int: value = None while self.queue: value = self.queue.popleft() self.queue_temp.append(value) while self.queue_temp: self.queue.append( self.queue_temp.popleft() ) return value def empty(self) -> bool: return not self.queue ``` ## Other languages ```java // Welcome to create a PR to complete the code of this language, thanks! ``` ## Intuition 3 - You can use only one queue to make it. The only change is in the `push` method. Just find a way to insert `x` to the front of the queue without using another `queue_temp`. - When implementing the `push` method, first `queue.push(x)`, so that `x` is inserted at the tail (back) of the queue, but we need to put `x` at the head (front) of the queue. - Execute `queue.length - 1` times `queue.push(queue.pop())` to move all the data before `x` to the back of `x`. ## Complexity - Time complexity: `push O(n), pop O(1), top O(1), empty O(1)`. - Space complexity: `O(n)`. ## JavaScript ```javascript var MyStack = function () { this.queue = [] }; MyStack.prototype.push = function (x) { this.queue.push(x) _.times( this.queue.length - 1, () => this.queue.push(this.queue.shift()) ) }; MyStack.prototype.pop = function () { return this.queue.shift() }; MyStack.prototype.top = function () { return this.queue[0] }; MyStack.prototype.empty = function () { return this.queue.length === 0 }; ``` ## Python ```python from collections import deque class MyStack: def __init__(self): self.queue = deque() def push(self, x: int) -> None: self.queue.append(x) # Rotate the queue to put the new element at the front # This is done by moving all existing elements to the back for _ in range(len(self.queue) - 1): self.queue.append( self.queue.popleft() ) def pop(self) -> int: return self.queue.popleft() def top(self) -> int: return self.queue[0] def empty(self) -> bool: return not self.queue ``` ## C++ ```cpp class MyStack { private: queue q_; public: MyStack() {} void push(int x) { q_.push(x); // Rotate the queue to put the new element at the front // This is done by moving all existing elements to the back for (int i = 0; i < q_.size() - 1; i++) { q_.push(q_.front()); // Add front element to back q_.pop(); // Remove from front } } int pop() { int top = q_.front(); q_.pop(); return top; } int top() { return q_.front(); } bool empty() { return q_.empty(); } }; ``` ## Go ```go type MyStack struct { queue []int } func Constructor() MyStack { return MyStack{ queue: make([]int, 0), } } func (this *MyStack) Push(x int) { // Add the new element to the queue this.queue = append(this.queue, x) // Rotate the queue to put the new element at the front // This is done by moving all existing elements to the back for i := 0; i < len(this.queue) - 1; i++ { // Move first element to the back this.queue = append(this.queue, this.queue[0]) this.queue = this.queue[1:] } } func (this *MyStack) Pop() int { // Remove and return the first element (stack's top) top := this.queue[0] this.queue = this.queue[1:] return top } func (this *MyStack) Top() int { return this.queue[0] } func (this *MyStack) Empty() bool { return len(this.queue) == 0 } ``` ## Ruby ```ruby class MyStack def initialize @queue = [] end def push(x) @queue.push(x) # Rotate the queue to put the new element at the front # This is done by moving all existing elements to the back (@queue.length - 1).times do @queue.push(@queue.shift) # Move first element to the back end end def pop @queue.shift end def top @queue.first end def empty @queue.empty? end end ``` ## Java ```java import java.util.LinkedList; import java.util.Queue; class MyStack { private Queue queue; public MyStack() { queue = new LinkedList<>(); } public void push(int x) { queue.offer(x); // Rotate the queue to put the new element at the front // This is done by moving all existing elements to the back for (int i = 0; i < queue.size() - 1; i++) { queue.offer(queue.poll()); // Move first element to the back } } public int pop() { return queue.poll(); } public int top() { return queue.peek(); } public boolean empty() { return queue.isEmpty(); } } ``` ## C# ```csharp using System.Collections.Generic; public class MyStack { private Queue queue; public MyStack() { queue = new Queue(); } public void Push(int x) { queue.Enqueue(x); // Rotate the queue to put the new element at the front // This is done by moving all existing elements to the back for (int i = 0; i < queue.Count - 1; i++) { queue.Enqueue(queue.Dequeue()); // Move first element to the back } } public int Pop() { return queue.Dequeue(); } public int Top() { return queue.Peek(); } public bool Empty() { return queue.Count == 0; } } ``` ## Other languages ```java // Welcome to create a PR to complete the code of this language, thanks! ``` Dear LeetCoders! For a better LeetCode problem-solving experience, please visit website [leetcoder.net](https://leetcoder.net): Dare to claim the best practices of LeetCode solutions! Will save you a lot of time! Original link: [225. Implement Stack using Queues - LeetCode Best Practices](https://leetcoder.net/en/leetcode/225-implement-stack-using-queues). GitHub repository: [f*ck-leetcode](https://github.com/fuck-leetcode/fuck-leetcode).