Visit original link: 225. Implement Stack using Queues - LeetCode Python/Java/C++/JS/C#/Go/Ruby Solutions for a better experience!
LeetCode link: 225. Implement Stack using Queues, difficulty: Easy.
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 elementxto 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()Returnstrueif the stack is empty,falseotherwise.
Notes:
- You must use only standard operations of a queue, which means that only
push to back,peek/pop from front,sizeandis emptyoperations 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.
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
1 <= x <= 9- At most
100calls will be made topush,pop,top, andempty. - All the calls to
popandtopare valid.
Follow-up: Can you implement the stack using only one queue?
- Two queues are used, one for input and output, and the other for temporary storage.
- There are two options for using queues to simulate the functions of a stack:
- Option 1: Simplify the
pop()andtop()operations and complicate thepush(x)operation. Whenpush(x), you need to insertxinto the front of the queue with effort. - Option 2: Simplify the
push(x)operation and complicate thepop()andtop()operations. Whenpop()ortop(), you need to find the last data with effort.
- Option 1: Simplify the
- 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 outrule.
- Time complexity:
push O(n), pop O(1), top O(1), empty O(1). - Space complexity:
O(n).
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.queueclass MyStack {
private:
queue<int> queue_;
queue<int> 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(); }
};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
}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
endvar 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
};class MyStack {
private Queue<Integer> queue;
private Queue<Integer> 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();
}
}public class MyStack
{
private Queue<int> queue; // main queue
private Queue<int> queueTemp;
public MyStack()
{
queue = new Queue<int>();
queueTemp = new Queue<int>();
}
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;
}
}// Welcome to create a PR to complete the code of this language, thanks!- Two queues are used, one for input and output, and the other for temporary storage.
- There are two options for using queues to simulate the functions of a stack:
- Option 1: Simplify the
pop()andtop()operations and complicate thepush(x)operation. Whenpush(x), you need to insertxinto the front of the queue with effort. - Option 2: Simplify the
push(x)operation and complicate thepop()andtop()operations. Whenpop()ortop(), you need to find the last data with effort.
- Option 1: Simplify the
- This article mainly introduces
Option 2to facilitate readers to compare the two solutions.
- Time complexity:
push O(1), pop O(n), top O(n), empty O(1). - Space complexity:
O(n).
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// Welcome to create a PR to complete the code of this language, thanks!- You can use only one queue to make it. The only change is in the
pushmethod. Just find a way to insertxto the front of the queue without using anotherqueue_temp. - When implementing the
pushmethod, firstqueue.push(x), so thatxis inserted at the tail (back) of the queue, but we need to putxat the head (front) of the queue. - Execute
queue.length - 1timesqueue.push(queue.pop())to move all the data beforexto the back ofx.
- Time complexity:
push O(n), pop O(1), top O(1), empty O(1). - Space complexity:
O(n).
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
};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.queueclass MyStack {
private:
queue<int> 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();
}
};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
}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
endimport java.util.LinkedList;
import java.util.Queue;
class MyStack {
private Queue<Integer> 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();
}
}using System.Collections.Generic;
public class MyStack
{
private Queue<int> queue;
public MyStack()
{
queue = new Queue<int>();
}
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;
}
}// Welcome to create a PR to complete the code of this language, thanks!🚀 Level Up Your Developer Identity
While mastering algorithms is key, showcasing your talent is what gets you hired.
We recommend leader.me — the ultimate all-in-one personal branding platform for programmers.
The All-In-One Career Powerhouse:
- 📄 Resume, Portfolio & Blog: Integrate your skills, GitHub projects, and writing into one stunning site.
- 🌐 Free Custom Domain: Bind your own personal domain for free—forever.
- ✨ Premium Subdomains: Stand out with elite tech handle like
name.leader.me.
Visit original link: 225. Implement Stack using Queues - LeetCode Python/Java/C++/JS/C#/Go/Ruby Solutions for a better experience!
GitHub repository: leetcode-python-java.