JavaScript中无内置栈和队列,可用数组模拟:栈用push/pop实现LIFO,队列用push/shift实现FIFO;高性能场景可用环形缓冲区优化,封装成类提升复用性。

JavaScript 中没有内置的栈(Stack)和队列(Queue)类型,但可以用数组(Array)或对象(Object)轻松模拟它们的行为。核心在于遵循对应的数据结构规则:栈是“后进先出”(LIFO),队列是“先进先出”(FIFO)。
用数组实现栈
数组的 push() 和 pop() 方法天然支持 LIFO 操作,是最常用、最简洁的栈实现方式。
-
入栈(push):用
arr.push(item)在末尾添加元素 -
出栈(pop):用
arr.pop()移除并返回末尾元素 -
查看栈顶(peek):访问
arr[arr.length - 1],不修改栈 -
判空:检查
arr.length === 0
示例:
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。
const stack = [];
stack.push(1); // [1]
stack.push(2); // [1, 2]
console.log(stack.pop()); // 2
console.log(stack[stack.length - 1]); // 1
用数组实现队列
数组也能模拟队列,但需注意性能:用 push() 入队没问题,但用 shift() 出队会在每次调用时移动所有后续元素,时间复杂度为 O(n)。适合小规模数据;大规模建议用链表或双端队列思路优化。
立即学习“Java免费学习笔记(深入)”;
-
入队(enqueue):用
arr.push(item) -
出队(dequeue):用
arr.shift()(移除并返回首项) -
查看队首(front):访问
arr[0] -
判空:同样检查
arr.length === 0
示例:
const queue = [];
queue.push('a'); // ['a']
queue.push('b'); // ['a', 'b']
console.log(queue.shift()); // 'a'
console.log(queue[0]); // 'b'
更高效的队列实现(环形缓冲区思路)
为避免 shift() 的性能问题,可手动维护头尾索引,复用数组空间。适用于对性能敏感或高频操作场景。
- 用一个数组 + 两个指针:
head(指向下一个要出队的位置)、tail(指向下一个要入队的位置) - 入队时写入
arr[tail],然后tail++;出队时读取arr[head],然后head++ - 当
head === tail时为空;当(tail + 1) % capacity === head时为满(需预留一个空位判断)
这种实现接近原生队列的 O(1) 均摊复杂度,但代码略长,日常开发中若非高频使用,数组 + push/shift 已足够清晰实用。
封装成类提升复用性
把逻辑封装成类,便于复用、测试和扩展。例如:
class Stack {
constructor() { this.items = []; }
push(item) { this.items.push(item); }
pop() { return this.items.pop(); }
peek() { return this.items[this.items.length - 1]; }
isEmpty() { return this.items.length === 0; }
}
class Queue {
constructor() { this.items = []; }
enqueue(item) { this.items.push(item); }
dequeue() { return this.items.shift(); }
front() { return this.items[0]; }
isEmpty() { return this.items.length === 0; }
}这样在多个地方使用时语义清晰,也方便后期替换底层实现(比如换成链表)而不影响调用方。










