队列
队列是一种先进先出(FIFO)的、线性的数据结构,与栈的结构类似,只是最先入队到队列的数据,会第一个出队,这与栈相反。 队列常见的应用场景是基于事件的处理系统,例如 JavaScript 事件循环机制、订单处理系统,邮件处理系统等,它们都是基于消息队列实现的。 队列常见的操作有:
- 入队,把数据添加到队列中。
- 出队,把数据从队列中取出。
- 查看队首元素。
- 查看队列的大小。
- 判断队列是否为空。
等方法。
JavaScript 实现
在 JavaScript 中,队列同样可以使用数组来实现,因为 JavaScript 的数组也支持队列模式,我们可以对它进行包装。
- 定义一个 Queue Class:
javascript
class Queue {}
- 在里边定义一个数组成员变量,保存队列内部的数据:
javascript
class Queue {
items = [];
}
接下来看一下队列的每个操作的实现方式,equeue() 把一个元素添加到队尾,它:
- 接收一个要添加的元素作为参数。
- 接收一个要添加的元素作为参数。
javascript
enqueue(item) {
this.items.push(item);
}
- dequeue() 方法会把队首元素出队并返回,在里边先判断当前队列是否为空,如果为空,返回“队列为空”,如果不为空,调用数组的 shift() 出队数组的第一个元素:
javascript
dequeue() {
if (this.isEmpty()) {
return "队列为空";
}
return this.items.shift();
}
- isEmpty() 方法判断了队列是否为空,这里调用了 size(),如果返回 0,则队列为空:
javascript
isEmpty() {
return this.size() === 0;
}
- size() 方法返回队列的大小,这里返回 items 数组的 length 属性:
javascript
size() {
return this.items.length;
}
- front() 方法返回队首元素,但并不从队列中出队,这里直接返回 items 数组的第 1 个元素:
javascript
front() {
if (this.isEmpty()) {
return "队列为空";
}
return this.items[0];
}
运行示例
我们使用 Queue 类,来编写一些队列的操作示例:
- 初始化一个 Queue 对象。
- 使用 enqueue() 添加元素 1, 2, 3 到队列中。
- 调用 size() 查看队列的大小,此时为 3。
- 调用 front() 查看队首元素,此时为 1,注意 front() 不会把元素从队列中出队。
- 调用 dequeue() 出队一个队首元素,1。
- 再调用 size() 查看队列的大小,此时为 2。
- 再查看队首元素,此时是 2。
- 我们再调用 3 次 dequeue() 出队操作,在第 3 次调用时,队列已经为空了,会返回队列为空。
javascript
const queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
console.log('队列大小:' + queue.size());
console.log('查看队首元素:' + queue.front());
const ele = queue.dequeue();
console.log('出队元素:' + ele);
console.log('队列大小:' + queue.size());
console.log('查看队首元素:' + queue.front());
console.log(queue.dequeue());
console.log(queue.dequeue());
console.log(queue.dequeue());
执行结果是:
bash
队列大小:3
查看队首元素:1
出队元素:1
队列大小:2
查看队首元素:2
2
3
队列为空