题目描述
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
- void push(int x) 将元素 x 推到队列的末尾
- int pop() 从队列的开头移除并返回元素
- int peek() 返回队列开头的元素
- boolean empty() 如果队列为空,返回 true ;否则,返回 false
说明:
你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
题目解析
本题难度为简单,主要是对栈和队列性质的验证。
题目中提示用两个栈实现队列操作,因此可以通过维护一个输入栈和一个输出栈,通过对两个栈操作,保证新输入的数字一直在输出栈栈底,从而实现“队列”。
代码
# Python3
class MyQueue:
def __init__(self):
from queue import LifoQueue
self._input_stack = LifoQueue()
self._output_stack = LifoQueue()
def push(self, x: int) -> None:
# 1. 输出栈顶 -> 输入栈底, 输出栈底 -> 输入栈顶
while not self._output_stack.empty():
self._input_stack.put(self._output_stack.get())
# 2. 将新数据放入输入栈顶
self._input_stack.put(x)
# 3. 输入栈顶 -> 输出栈底, 输入栈底 -> 输出栈顶
while not self._input_stack.empty():
self._output_stack.put(self._input_stack.get())
def pop(self) -> int:
return self._output_stack.get()
def peek(self) -> int:
# 取出栈顶数字
res = self._output_stack.get()
# 将取出数字放回输出栈顶
# 1. 将取出数放入输入栈底
self._input_stack.put(res)
# 2. 输出次栈顶 -> 输入次栈底, 输出栈底 -> 输入栈顶
while not self._output_stack.empty():
self._input_stack.put(self._output_stack.get())
# 3. 输入栈顶 -> 输出栈底, 输入栈底 -> 输出栈顶
while not self._input_stack.empty():
self._output_stack.put(self._input_stack.get())
return res
def empty(self) -> bool:
return self._output_stack.empty()
if __name__ == '__main__':
test = MyQueue()
test.push(1)
test.push(2)
test.push(3)
test.push(4)
print(test.peek())
print(test.pop())
test.push(5)
print(test.pop())
print(test.pop())
print(test.pop())
print(test.pop())
该文章介绍了一种使用Python中的LifoQueue(后进先出栈)实现先进先出队列的方法。通过维护输入栈和输出栈,实现了push、pop、peek和empty等队列操作。在push时,数据首先被转移到输入栈,然后通过两次栈之间的转移确保新数据位于输出栈底部。在pop和peek操作时,数据从输出栈获取,必要时通过转移保持队列特性。
809

被折叠的 条评论
为什么被折叠?



