返回

巧妙利用栈构造队列—— LeetCode 232

闲谈

引言:队列与栈的基础知识

在介绍用栈实现队列之前,我们先来回顾一下队列和栈这两种基本数据结构。队列是一种遵循“先进先出”(FIFO)原则的数据结构,意味着最早进入队列的元素也将最先被移除。而栈则遵循“后进先出”(LIFO)原则,即最后进入栈的元素将最先被移除。

妙招:用两个栈模拟队列

虽然栈与队列的工作方式截然不同,但我们可以巧妙地利用两个栈来模拟队列的行为。具体步骤如下:

  1. 入队操作
    当我们需要将元素推入队列时,我们将其推入第一个栈(称为栈 A)。
  2. 出队操作
    当我们需要从队列中移除元素时,我们首先检查第二个栈(称为栈 B)是否为空。如果栈 B 不为空,则直接从栈 B 弹出元素。否则,我们将栈 A 中的所有元素依次弹出并推入栈 B,然后从栈 B 弹出元素。
  3. 查看队首元素操作
    当我们需要查看队列的队首元素时,我们只需查看栈 B 的栈顶元素即可。
  4. 判断队列是否为空操作
    当我们需要判断队列是否为空时,我们只需检查两个栈是否都为空即可。

代码示例:用 Python 实现队列

class MyQueue:
    def __init__(self):
        self.stack_in = []  # 入队栈
        self.stack_out = []  # 出队栈

    def push(self, x):
        self.stack_in.append(x)

    def pop(self):
        if not self.stack_out:
            while self.stack_in:
                self.stack_out.append(self.stack_in.pop())
        return self.stack_out.pop()

    def peek(self):
        if not self.stack_out:
            while self.stack_in:
                self.stack_out.append(self.stack_in.pop())
        return self.stack_out[-1]

    def empty(self):
        return not self.stack_in and not self.stack_out

结语:掌握巧妙技巧,轻松解决问题

通过利用两个栈巧妙地模拟队列的行为,我们不仅可以解决 LeetCode 232 这道题目,更重要的是,我们掌握了一种灵活的技巧,可以在其他类似问题中灵活运用。希望本篇文章能够帮助您深入理解栈和队列的数据结构,并为您的编程之旅增添新的灵感。