1. 栈与队列的基本概念解析
在数据结构的世界里,栈(Stack)和队列(Queue)就像是一对性格迥异的双胞胎。栈遵循LIFO(Last In First Out)原则,就像我们叠放的一摞盘子,最后放上去的总是最先被取用;而队列则遵循FIFO(First In First Out)原则,更像是排队买奶茶的场景,先来的人先获得服务。
这个题目之所以经典,是因为它要求我们用栈这种"后进先出"的结构,模拟出队列"先进先出"的行为。这就好比要用一个只能从顶部放入和取出物品的箱子,模拟出两端都能操作的管道——看似矛盾的需求背后,其实蕴含着精妙的设计思路。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 双栈法的设计原理
2.1 核心思路拆解
实现这个"魔法"的关键在于使用两个栈——我们暂且称它们为输入栈(inputStack)和输出栈(outputStack)。当需要执行队列的push操作时,我们直接将元素压入输入栈;当需要执行pop或peek操作时,如果输出栈为空,我们就把输入栈的所有元素依次弹出并压入输出栈,这样原本在输入栈底的元素就到了输出栈顶。
这个过程就像把一摞书从左手倒到右手——原本在最下面的书现在跑到了最上面。通过这种巧妙的"倒腾",我们实现了元素的顺序反转,从而用栈模拟出了队列的行为。
2.2 时间复杂度分析
这种设计的美妙之处在于它的均摊时间复杂度:
- push操作:O(1) - 直接压入输入栈
- pop/peek操作:均摊O(1) - 虽然偶尔需要将输入栈全部倒入输出栈(O(n)),但每个元素最多被移动两次(进输入栈一次,进输出栈一次),所以均摊下来仍然是常数时间
3. 具体实现步骤详解
3.1 类结构设计
python复制class MyQueue:
def __init__(self):
self.input_stack = []
self.output_stack = []
我们首先定义MyQueue类,初始化两个空栈。这里使用Python的list来模拟栈的行为,因为list的append和pop操作正好对应栈的push和pop。
3.2 push操作实现
python复制def push(self, x: int) -> None:
self
