- 用队列实现栈 难度(简单)
请你仅使用两个队列实现一个后入先出(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 都保证栈不为空
进阶:你能否仅用一个队列来实现栈。
题解: 双队列实现栈,首先进栈的数据先进队列1,出栈时将队列1中除最后一个数据全部出队列放入队列2中保存,等出栈后再将队列2中数据给队列1,队列2起临时存储作用。
from collections import deque
class MyStack:
def __init__(self):
self.queue_in = deque()
self.queue_out = deque()
def push(self, x: int) -> None:
self.queue_in.append(x)
def pop(self) -> int:
#首先判空
if self.empty():
return None
#将queue_in中所有元素除最后一个,依次出列放入queue_out,queue_out和queue_in一模一样只是少个元素
for i in range(len(self.queue_in) - 1):
self.queue_out.append(self.queue_in.popleft())
#交换队列,将剩余一个元素的队列给queue_out
self.queue_in, self.queue_out = self.queue_out, self.queue_in
#输出
return self.queue_out.popleft()
# return self.queue_in.pop() 其实一个self.queue_in.pop() 就可实现上述操作,只是题目让用两个队列
def top(self) -> int:
if self.empty():
return None
return self.queue_in[-1]
def empty(self) -> bool:
#只有in会存数据
return len(self.queue_in) == 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()
题解:单队列实现栈,首先进栈进队列,出栈将除队列最后一个元素外其他元素依次放入最后一个元素的后面。
from collections import deque
class MyStack:
def __init__(self):
self.queue_one = deque()
def push(self, x: int) -> None:
self.queue_one.append(x)
def pop(self) -> int:
if self.empty():
return None
for i in range(len(self.queue_one) - 1):
self.queue_one.append(self.queue_one.popleft())
return self.queue_one.popleft()
def top(self) -> int:
if self.empty():
return None
return self.queue_one[-1]
def empty(self) -> bool:
return len(self.queue_one) == 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()