232.用栈实现队列
栈(Stack)是一种 先进后出 的数据结构,最先入栈的元素最后出栈。可以想像栈为一支窄试管,存放了一列豆子,我们需要垂直握着试管,要想拿到底部的豆子,必须先拿走试管口的豆子,因此栈的出口处被称为 栈顶,底部为 栈底。
队列(Queue)是一种 先进先出 的数据结构,最先入队的元素最先出队。同样以试管举例,只不过这次的试管没有底,是连通的玻璃管,我们需要水平拿着试管。因此,队列的入口处被称为队尾,出口处被称为队首。
Python中的 list
可以非常方便地作为 stack 使用,有以下在栈顶处进行操作的方法:
- 入栈:使用
append(x)
方法可以将元素x
推入栈顶。- 出栈:使用无参数的
pop()
方法可以从栈顶 弹出 一个元素,并返回该元素。
思路:
使用栈模拟队列,也就是我们在只使用 append(x) 和 pop() 这两种方法,实现先进先出。
我们需要准备两个栈,inStack 用于入栈,outStack 用于出栈,模拟队列的 先进先出。当需要模拟队列的入队,我们直接使用 append(x) 向 inStack 添加元素。当需要模拟队列的出队,我们直接使用 pop() 从 inStack 取出元素,并使用 append(x) 向 outStack 添加元素。这样一来,outStack 就具有和 inStack 相同的元素,只不过顺序相反,此时使用 pop() 模拟队列的出队。
class MyQueue:
def __init__(self):
self.inStack = [] # 用于入队的栈
self.outStack = [] # 用于出队的栈
def push(self, x: int) -> None:
self.inStack.append(x)
def pop(self) -> int:
# 我们需要依赖 outStack 实现出队
# 若其为空,则需要把 inStack 的所有元素移动到 outStack
self.peek()
return self.outStack.pop()
def peek(self) -> int:
# 我们需要依赖 outStack 实现出队
# 若其为空,则需要把 inStack 的所有元素移动到 outStack
if not self.outStack:
while self.inStack:
self.outStack.append(self.inStack.pop())
return self.outStack[-1]
def empty(self) -> bool:
return not self.inStack and not self.outStack
# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()
225. 用队列实现栈
Python中的 deque 是一种既可以从前端也可以从后端进行添加和移除元素的线性数据结构。它非常适合用作队列,有以下在两端进行操作的方法:
- 入队:使用
append(x)
方法可以将元素x
加入队列的尾部(队尾)。- 出队:使用
popleft()
方法可以从队列的头部(队首)移除一个元素,并返回该元素。
思路:
使用队列模拟栈,也就是我们在只使用 append(x) 和 popleft() 这两种方法,实现先进后出。
我们可以使用一个 deque,将除了最后一个添加的元素之外的所有元素重新入队,这样可以确保最先添加的元素始终在队列的末尾,此时使用 popleft(),最先添加的元素将会是最后一个出队的,也就是说,deque 的队首为模拟的栈顶。
class MyStack:
def __init__(self):
self.queue = deque() # 构建双端队列
def push(self, x: int) -> None:
n = len(self.queue)
self.queue.append(x)
for _ in range(n):
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
# 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()