2025-11-29-JavaScript中的数组方法与栈(Stack)和队列(Queue)的实现
First Post:
Last Update:
Page View: loading...
Last Update:
Page View: loading...
JavaScript 中的数组方法完全可以用来实现栈(Stack)和队列(Queue)的基本功能
这是因为栈和队列本质上是对“插入”和“删除”操作位置的限制,而数组的push、pop、unshift、shift这些方法正好提供了在两端高效操作的能力
先简单回顾一下这四种数组方法
| 方法 | 操作位置 | 操作类型 | 返回值 | 时间复杂度 |
|---|---|---|---|---|
push() |
尾部 | 添加 | 新长度 | O(1) |
pop() |
尾部 | 删除 | 被删除元素 | O(1) |
unshift() |
头部 | 添加 | 新长度 | O(n) |
shift() |
头部 | 删除 | 被删除元素 | O(n) |
1. 实现栈(Stack)——后进先出(LIFO,Last In First Out)
主要使用数组的末尾操作实现:
| 操作 | 数组方法 | 示例代码 | 时间复杂度 |
|---|---|---|---|
| 入栈(push) | array.push(item) | stack.push(1) | O(1) |
| 出栈(pop) | array.pop() | const item = stack.pop() | O(1) |
示例:
1 | |
2. 实现队列(Queue)——先进先出(FIFO,First In First Out)
方式一:头部删除 + 尾部插入
| 操作 | 数组方法 | 示例代码 | 时间复杂度 |
|---|---|---|---|
| 入队(enqueue) | array.push(item) | queue.push(1) | O(1) |
| 出队(dequeue) | array.shift() | const item = queue.shift() | O(n) |
问题:shift() 会导致数组所有元素向前移动,时间复杂度为 O(n),频繁操作时性能很差
方式二:尾部插入 + 头部删除
| 操作 | 数组方法 | 示例代码 | 时间复杂度 |
|---|---|---|---|
| 入队 | array.unshift(item) | queue.unshift(1) | O(n) |
| 出队 | array.pop() | const item = queue.pop() | O(1) |
同样存在 O(n) 操作
如果需要高效队列,可以使用双端队列实现或第三方库,有几种方式
- 使用两个数组模拟(常见面试实现):
- 一个栈用于入队,一个栈用于出队,需要时倒腾
- 使用 JavaScript 的 Deque(双端队列)库:
- 如 js-deque 或其他库,支持 O(1) 的头尾操作
- ES6+ 原生替代:虽然没有内置 Queue,但可以用 Array + 手动索引模拟环形队列(较复杂)