1. 栈与队列的相爱相杀:数据结构互转实战
作为程序员,栈和队列是我们最熟悉的两种基础数据结构。栈的"后进先出"(FILO)和队列的"先进先出"(FIFO)特性看似简单,但当它们需要相互转换时,却能衍生出许多有趣的算法问题。今天我们就来深度剖析LeetCode Hot100中的三道经典题目,看看如何用栈实现队列、用队列实现栈,以及如何用栈解决括号匹配问题。
1.1 为什么需要数据结构互转?
在实际开发中,我们经常会遇到需要转换数据结构特性的场景。比如:
- 某些语言或框架只提供了栈的实现,但业务逻辑需要队列的特性
- 算法优化时需要利用不同数据结构的性能特点
- 面试中考察对数据结构本质的理解
理解这些转换背后的思想,不仅能帮助我们解决具体问题,更能深化对数据结构本质的认识。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 用栈实现队列(LeetCode 232)
2.1 问题分析与设计思路
队列是FIFO结构,而栈是FILO结构。要用栈模拟队列,我们需要找到一种方法,让最先进入的元素能够最先被取出。
关键观察:单个栈无法实现队列,因为无论怎么操作,最后进入的元素总是最先出来。但如果我们使用两个栈,就能实现元素的"反转":
- 一个栈(stIn)专门用于入队操作
- 当需要出队时,如果另一个栈(stOut)为空,就把stIn的所有元素弹出并压入stOut
- 这样stOut的栈顶就是最早进入的元素
这个技巧的核心在于:两次栈操作相当于一次队列操作。第一次压栈是逆序,第二次弹栈又恢复原序。
2.2 代码实现与复杂度分析
java复制class MyQueue {
private LinkedList<Integer> stOut;
private LinkedList<Integer> stIn;
public MyQueue() {
stOut = new LinkedList<>();
stIn = new LinkedList<>();
}
public void push(int x) {
stIn.push(x); // O(1)
}
public int pop() {
tr
