返回
巧用队列实现栈:LeetCode第225题解析
前端
2023-11-20 15:49:58
1. 栈与队列的数据结构
栈 是一种先进后出(FILO)的数据结构,这意味着最近添加的元素将首先被移除。栈在计算机科学中广泛应用于函数调用、递归和语法分析等场景。
队列 是一种先进先出(FIFO)的数据结构,这意味着最早添加的元素将首先被移除。队列常用于处理排队、消息传递和任务调度等问题。
2. 利用队列实现栈
乍一看,队列和栈似乎截然不同。然而,我们可以巧妙地利用队列来模拟栈的行为。具体做法是使用两个队列:
- 队列A :作为栈的主要存储结构,用于压入和弹出元素。
- 队列B :作为辅助队列,用于临时存储元素。
3. 实现栈的四个基本操作
1. push(x)
- 将元素x压入队列A。
2. top()
- 将队列A中除队首元素外的所有元素依次出队,并压入队列B。
- 此时,队列A中仅剩队首元素,即栈顶元素。
- 将队列B中所有元素依次出队,并压入队列A。
- 返回栈顶元素。
3. pop()
- 将队列A中除队首元素外的所有元素依次出队,并压入队列B。
- 此时,队列A中仅剩队首元素,即栈顶元素。
- 将栈顶元素出队并丢弃。
- 将队列B中所有元素依次出队,并压入队列A。
4. empty()
- 若队列A为空,则栈为空,返回true;否则,返回false。
4. LeetCode第225题解析
LeetCode第225题要求我们仅使用两个队列实现一个栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。我们可以按照上述方法来实现。
class MyStack:
def __init__(self):
self.queueA = []
self.queueB = []
def push(self, x):
self.queueA.append(x)
def top(self):
while len(self.queueA) > 1:
self.queueB.append(self.queueA.pop(0))
top = self.queueA[0]
while len(self.queueB) > 0:
self.queueA.append(self.queueB.pop(0))
return top
def pop(self):
while len(self.queueA) > 1:
self.queueB.append(self.queueA.pop(0))
self.queueA.pop(0)
while len(self.queueB) > 0:
self.queueA.append(self.queueB.pop(0))
def empty(self):
return len(self.queueA) == 0
5. 结语
通过巧妙地利用两个队列,我们能够实现一个栈的数据结构。这种方法可以用于解决各种各样的问题,包括LeetCode第225题。通过对本题的深入剖析,您已经掌握了利用队列实现栈的精髓。