1. 理解题目本质与需求分析
这道力扣题目看似简单,实则暗藏玄机。题目编号232要求我们仅使用栈(stack)这种数据结构来实现队列(queue)的所有基本操作。作为数据结构基础题,它经常出现在大厂面试的第一轮技术面中,用来考察候选人对基础数据结构的理解深度。
队列是FIFO(先进先出)结构,而栈是LIFO(后进先出)结构,两者特性完全相反。用栈实现队列,相当于要用"反向操作"的特性来模拟"正向操作"的行为。在实际工程中,这种数据结构转换的思想也经常用于系统设计,比如用两个数据库表实现消息队列的消费顺序控制。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心思路与算法设计
2.1 双栈法的设计原理
实现这个功能的核心在于使用两个栈:一个输入栈(inStack)负责处理入队操作,一个输出栈(outStack)负责处理出队和查看队首元素的操作。当需要出队时,如果输出栈为空,就将输入栈的所有元素依次弹出并压入输出栈,这样输出栈的栈顶元素就是队列的队首元素。
这种设计的时间复杂度分析:
- 入队操作(push):直接压入输入栈,O(1)时间复杂度
- 出队操作(pop):如果输出栈非空,直接弹出栈顶,O(1);如果为空,需要将输入栈所有元素转移到输出栈,O(n)的摊还时间复杂度
- 查看队首(peek):与pop类似,O(1)或O(n)摊还时间复杂度
- 判断空(empty):两个栈都为空时队列为空,O(1)
2.2 关键操作的具体实现
python复制class MyQueue:
def __init__(self):
self.inStack = []
self.outStack = []
def push(self, x: int) -> None:
self.inStack.append(x)
def pop(self) -> int:
if not self.outStack:
while self.inStack:
self.outStack.append(self.inStack.pop())
return self.outStack.pop()
def peek(self)
