2025-11-29-JavaScript中的数组方法与栈(Stack)和队列(Queue)的实现
462 个字
2 分钟
2025-11-29-JavaScript中的数组方法与栈(Stack)和队列(Queue)的实现
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) |
示例:
const stack = [];stack.push(1); // [1]stack.push(2); // [1, 2]stack.push(3); // [1, 2, 3]console.log(stack.pop()); // 3console.log(stack.pop()); // 2console.log(stack); // [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 + 手动索引模拟环形队列(较复杂)
分享到社交平台
将本文分享给你的朋友们
2025-11-29-JavaScript中的数组方法与栈(Stack)和队列(Queue)的实现
https://firefly.cuteleaf.cn/posts/2025-12-25-javascript中的数组方法与栈stack和队列queue的实现/ 相关文章 智能推荐
1
2025-11-27-JavaScript 实现哈希表
数据结构 2025-11-27
2
2025-11-25 关于链表(Javascript)
数据结构 2025-11-25
3
数据结构-栈
数据结构 2025-04-18
4
数据结构-队列
数据结构 2025-04-11
5
2025-12-26-Javascript/TypeScript 的顺序表,链表实现
数据结构 2025-12-26
随机文章 随便看看
Zhongye