🧠 引言
栈(Stack) 和 队列(Queue) 是最基础、最常用的数据结构之一。
但它们不仅仅是面试考点——
- 浏览器“回退/前进”靠的是栈
- 微任务 / 宏任务调度用的是队列
- React Fiber 架构中也用到了优先队列
本篇我们将用 JS 与 Python 双语,手写栈与队列结构,并联系实际场景,彻底搞懂这两个“基础杀器”。
🧱 一、栈(Stack)
✅ 特性
- 后进先出(LIFO)
- 插入、删除只在栈顶进行
💻 二、JS 手写栈
class Stack {
constructor() {
this.items = [];
}
push(val) {
this.items.push(val);
}
pop() {
return this.items.pop();
}
peek() {
return this.items[this.items.length - 1];
}
isEmpty() {
return this.items.length === 0;
}
}
// 示例
const s = new Stack();
s.push(1);
s.push(2);
console.log(s.pop()); // 输出 2
console.log(s.peek()); // 输出 1
🐍 Python 手写栈
class Stack:
def __init__(self):
self.items = []
def push(self, val):
self.items.append(val)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[-1]
def is_empty(self):
return len(self.items) == 0
# 示例
s = Stack()
s.push(1)
s.push(2)
print(s.pop()) # 输出 2
print(s.peek()) # 输出 1
📦 三、栈的真实应用场景
场景 | 应用说明 |
---|---|
浏览器回退/前进 | 当前页入栈,点击回退时出栈 |
函数调用栈 | JS 执行栈、递归函数调用 |
括号匹配 | 用栈验证括号是否成对出现 |
深度优先遍历(DFS) | 图或树的 DFS 实现 |
📬 四、队列(Queue)
✅ 特性
- 先进先出(FIFO)
- 从队尾插入,从队首取出
💻 JS 手写队列
class Queue {
constructor() {
this.items = [];
}
enqueue(val) {
this.items.push(val);
}
dequeue() {
return this.items.shift();
}
front() {
return this.items[0];
}
isEmpty() {
return this.items.length === 0;
}
}
// 示例
const q = new Queue();
q.enqueue(10);
q.enqueue(20);
console.log(q.dequeue()); // 10
console.log(q.front()); // 20
🐍 Python 手写队列
class Queue:
def __init__(self):
self.items = []
def enqueue(self, val):
self.items.append(val)
def dequeue(self):
return self.items.pop(0)
def front(self):
return self.items[0]
def is_empty(self):
return len(self.items) == 0
# 示例
q = Queue()
q.enqueue(10)
q.enqueue(20)
print(q.dequeue()) # 输出 10
print(q.front()) # 输出 20
📦 五、队列的真实应用场景
场景 | 应用说明 |
---|---|
宏任务/微任务调度 | JS Event Loop 中微任务队列 |
打印任务队列 | 按顺序打印多个文件 |
广度优先遍历(BFS) | 图/树的层序遍历 |
消息队列 MQ / Kafka | 分布式系统中用于异步消息投递 |
⚠️ 六、易错点总结
问题 | 正解 |
---|---|
队列用 shift() 性能低? | 是的,大量操作建议用双端队列结构优化 |
栈的 peek() 实现忘记判断 | 建议判断是否为空防止 undefined / error |
队列空时直接 pop(0) 报错 | 需加 isEmpty() 判断 |
🧩 七、拓展任务
- 实现一个双端队列 Deque(支持头尾插入/删除)
- 实现一个浏览器历史记录系统(入栈+出栈)
- 用队列实现“节流调度器”(如每秒执行一次任务)
🧠 总结一句话
栈负责“回头看”,队列负责“往前冲”,它们是你数据结构技能树上不可缺的两把武器!
下一篇预告:
📘 第9篇:【递归与迭代大对决】爬楼梯问题 JS+Python 双解,性能全面比较!