用JavaScript实现队列的核心思路与代码示例
队列是一种遵循先进先出(FIFO)原则的线性数据结构,日常开发中常用于任务调度、消息处理等场景。JavaScript本身没有内置的队列数据类型,但我们可以通过数组或者自定义类的方式灵活实现队列功能,下面分别介绍两种常见的实现方案。
基于数组的简易实现
数组原生提供了元素增删的方法,我们可以借助这些方法快速模拟队列的基础操作。队列的核心操作包括入队(元素添加到队尾)、出队(移除队首元素)、查看队首元素、判断队列是否为空、获取队列长度,下面是对应的实现代码:
// 基于数组实现队列
class ArrayQueue {
constructor() {
// 用数组存储队列元素
this.items = [];
}
// 入队:将元素添加到队尾
enqueue(element) {
this.items.push(element);
}
// 出队:移除队首元素并返回
dequeue() {
// 队列为空时返回undefined
if (this.isEmpty()) {
return undefined;
}
return this.items.shift();
}
// 查看队首元素,不修改队列
peek() {
if (this.isEmpty()) {
return undefined;
}
return this.items[0];
}
// 判断队列是否为空
isEmpty() {
return this.items.length === 0;
}
// 获取队列长度
size() {
return this.items.length;
}
// 清空队列
clear() {
this.items = [];
}
}
// 使用示例
const queue = new ArrayQueue();
queue.enqueue('任务1');
queue.enqueue('任务2');
queue.enqueue('任务3');
console.log(queue.peek()); // 输出:任务1
console.log(queue.dequeue()); // 输出:任务1
console.log(queue.size()); // 输出:2
console.log(queue.isEmpty()); // 输出:false这种实现方式代码简洁,适合大多数常规场景。不过需要注意,数组的shift()方法在删除队首元素时,需要将后续所有元素向前移动一位,当队列元素数量较多时,可能会有性能损耗。
基于对象的优化实现
如果需要频繁操作大数量级的队列,可以改用对象存储元素,通过维护队首和队尾的指针来避免元素移动的性能问题,具体实现如下:
// 基于对象实现队列,优化大数量场景下的性能
class ObjectQueue {
constructor() {
this.items = {};
// 队首指针,指向第一个元素的索引
this.front = 0;
// 队尾指针,指向下一个新元素的插入位置
this.rear = 0;
}
// 入队:将元素添加到队尾
enqueue(element) {
this.items[this.rear] = element;
this.rear++;
}
// 出队:移除队首元素并返回
dequeue() {
if (this.isEmpty()) {
return undefined;
}
const item = this.items[this.front];
// 删除队首元素
delete this.items[this.front];
this.front++;
return item;
}
// 查看队首元素
peek() {
if (this.isEmpty()) {
return undefined;
}
return this.items[this.front];
}
// 判断队列是否为空
isEmpty() {
return this.rear - this.front === 0;
}
// 获取队列长度
size() {
return this.rear - this.front;
}
// 清空队列
clear() {
this.items = {};
this.front = 0;
this.rear = 0;
}
}
// 使用示例
const objQueue = new ObjectQueue();
objQueue.enqueue(10);
objQueue.enqueue(20);
objQueue.enqueue(30);
console.log(objQueue.peek()); // 输出:10
console.log(objQueue.dequeue()); // 输出:10
console.log(objQueue.size()); // 输出:2这种实现方式通过维护两个指针来标记队首和队尾的位置,入队和出队操作的时间复杂度都是O(1),不会因为队列元素增多而出现性能下降,更适合处理大量数据的场景。
两种实现的对比选择
| 实现方式 | 优势 | 不足 | 适用场景 |
|---|---|---|---|
| 基于数组 | 代码简洁,易于理解和维护,无需额外维护指针 | 大量元素出队时shift()有性能损耗 | 数据量小、操作不频繁的普通场景 |
| 基于对象 | 增删操作性能稳定,无元素移动开销 | 需要额外维护指针,代码稍复杂 | 数据量大、频繁操作队列的高性能场景 |
实际开发中可以根据业务场景选择合适的实现方式,如果不确定数据量级,基于对象的实现通常是更稳妥的选择。
JavaScript队列数据结构数组实现对象实现FIFO 本作品最后修改时间:2026-05-23 23:04:50