返回

巧用队列实现栈:LeetCode第225题解析

前端

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题。通过对本题的深入剖析,您已经掌握了利用队列实现栈的精髓。