LeetCode225. 用队列实现栈🌟🌟🌟🌟🌟简单
课后作业
问题描述
原文链接:225. 用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x)将元素 x 压入栈顶。int pop()移除并返回栈顶元素。int top()返回栈顶元素。boolean empty()如果栈是空的,返回true;否则,返回false。
注意:
- 你只能使用队列的基本操作 —— 也就是
push to back、peek/pop from front、size和is empty这些操作。 - 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
示例:
输入:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]
解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False
提示:
1 <= x <= 9- 最多调用
100次push、pop、top和empty - 每次调用
pop和top都保证栈不为空
代码实现
Java
class MyStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
public MyStack() {
queue1 = new LinkedList();
queue2 = new LinkedList();
}
public void push(int x) {
//永远让queue1为空
queue1.offer(x);
while(!queue2.isEmpty()){
queue1.offer(queue2.poll());
}
// 交换队列1和队列2
Queue<Integer> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
public int pop() {
return queue2.poll();
}
public int top() {
return queue2.peek();
}
public boolean empty() {
return queue2.isEmpty();
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/
Python
from collections import deque
class MyStack(object):
def __init__(self):
self.queue1 = deque()
self.queue2 = deque()
def push(self, x):
"""
:type x: int
:rtype: None
"""
# 永远让 queue1 为空
self.queue1.append(x)
while len(self.queue2) > 0:
self.queue1.append(self.queue2.popleft())
# 交换队列1和队列2
self.queue1, self.queue2 = self.queue2, self.queue1
def pop(self):
"""
:rtype: int
"""
return self.queue2.popleft()
def top(self):
"""
:rtype: int
"""
return self.queue2[0]
def empty(self):
"""
:rtype: bool
"""
return len(self.queue2) == 0
# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()
C++
class MyStack {
private:
queue<int> queue1;
queue<int> queue2;
public:
MyStack() {
}
void push(int x) {
//永远让queue1为空
queue1.push(x);
while (!queue2.empty()) {
queue1.push(queue2.front());
queue2.pop();
}
// 交换队列1和队列2
swap(queue1, queue2);
}
int pop() {
int top = queue2.front();
queue2.pop();
return top;
}
int top() {
return queue2.front();
}
bool empty() {
return queue2.empty();
}
};
// Your MyStack object will be instantiated and called as such:
// MyStack* obj = new MyStack();
// obj->push(x);
// int param_2 = obj->pop();
// int param_3 = obj->top();
// bool param_4 = obj->empty();
Go
type MyStack struct {
queue1 []int
queue2 []int
}
func Constructor() MyStack {
return MyStack{make([]int,0), make([]int,0)}
}
func (this *MyStack) Push(x int) {
//永远让queue1为空
this.queue1 = append(this.queue1, x)
for len(this.queue2) > 0 {
this.queue1 = append(this.queue1, this.queue2[0])
this.queue2 = this.queue2[1:]
}
// 交换队列1和队列2
this.queue1, this.queue2 = this.queue2, this.queue1
}
func (this *MyStack) Pop() int {
top := this.queue2[0]
this.queue2 = this.queue2[1:]
return top
}
func (this *MyStack) Top() int {
return this.queue2[0]
}
func (this *MyStack) Empty() bool {
return len(this.queue2) == 0
}
// Your MyStack object will be instantiated and called as such:
// obj := Constructor();
// obj.Push(x);
// param_2 := obj.Pop();
// param_3 := obj.Top();
// param_4 := obj.Empty();