返回

用两个栈轻松构建队列:巧妙解题,剑指 Offer 09

闲谈

前言

队列和栈是数据结构中至关重要的概念。队列以先进先出的顺序处理元素,而栈则遵循后进先出的原则。剑指 Offer 09 题要求我们仅使用两个栈来模拟队列的行为,这需要巧妙的思考和算法设计。

算法思路

要使用两个栈模拟队列,我们需要定义两种操作:

  • appendTail(value): 将一个元素插入队列的尾部。
  • deleteHead(): 从队列的头部删除一个元素。

为了实现这些操作,我们可以使用两个栈,分别称为 stack1stack2

appendTail 操作

当我们使用 appendTail 操作向队列尾部插入元素时,我们将元素直接压入 stack1。这是因为队列的尾部元素应该在栈顶。

def appendTail(self, value):
    self.stack1.append(value)

deleteHead 操作

当我们使用 deleteHead 操作从队列头部删除元素时,情况会稍微复杂一些。如果 stack2 不为空,我们直接从 stack2 的栈顶弹出元素并返回。

if not self.stack2:
    while self.stack1:
        self.stack2.append(self.stack1.pop())
if self.stack2:
    return self.stack2.pop()

然而,如果 stack2 为空,我们需要将 stack1 中的所有元素转移到 stack2 中,然后才能从 stack2 的栈顶弹出元素。

else:
    while self.stack1:
        self.stack2.append(self.stack1.pop())
    return self.stack2.pop()

示例

下面是一个使用两个栈模拟队列的示例:

class MyQueue:

    def __init__(self):
        self.stack1 = []
        self.stack2 = []

    def appendTail(self, value):
        self.stack1.append(value)

    def deleteHead(self):
        if not self.stack2:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
        if self.stack2:
            return self.stack2.pop()
        else:
            return None

总结

使用两个栈模拟队列是一种巧妙的算法,它利用了栈的后进先出特性来实现队列的先进先出行为。通过理解算法思路并掌握实现细节,您可以轻松应对剑指 Offer 09 题,并为解决实际问题奠定坚实的基础。