认识队列
队列(Queue)是一种运算受限的线性表,特点:先进先出。(FIFO:First In First Out)
受限之处:
- 只允许在表的前端(front)进行删除操作。
- 只允许在表的后端(rear)进行插入操作。
队列图解
队列的应用场景
- 食堂排队打饭
- JS异步任务中的队列
队列的实现
队列的实现和栈一样,有两种方案:
- 基于数组实现。
- 基于链表实现。
队列常见的操作
enqueue(element)向队列尾部添加一个(或多个)新的项。dequeue()移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。front()返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息)。isEmpty()如果队列中不包含任何元素,返回 true,否则返回 false。size()返回队列包含的元素个数,与数组的 length 属性类似。toString()将队列中的内容,转成字符串形式。
代码实现
class Queue {
constructor() {
this.items = []
}
// 入队
enqueue(element) {
this.items.push(element)
}
// 出队
dequeue() {
return this.items.shift()
}
// 返回队列的第一个元素
front() {
return this.items[0]
}
// 判断队列是否为空
isEmpty() {
return this.items.length === 0
}
// 返回队列包含的元素个数
size() {
return this.items.length
}
// 将队列中的内容,转成字符串形式
toString() {
let str = ''
for (let item of this.items) {
str += item + ' '
}
return str
}
}
测试代码
const queue = new Queue();
// enqueue() 测试
queue.enqueue("a");
queue.enqueue("b");
queue.enqueue("c");
queue.enqueue("d");
console.log(queue.items); //--> ["a", "b", "c", "d"]
// dequeue() 测试
queue.dequeue();
queue.dequeue();
console.log(queue.items); //--> ["c", "d"]
// front() 测试
console.log(queue.front()); //--> c
// isEmpty() 测试
console.log(queue.isEmpty()); //--> false
// size() 测试
console.log(queue.size()); //--> 2
// toString() 测试
console.log(queue.toString()); //--> c d
队列的应用
使用队列实现小游戏:击鼓传花。
分析:传入一组数据集合和设定的数字 number,循环遍历数组内元素,遍历到的元素为指定数字 number 时将该元素删除,直至数组剩下一个元素。
代码实现
function passGame(nameList, number) {
// 创建一个队列
const queue = new Queue();
for(let item of nameList) {
queue.enqueue(item)
}
// 如果队列的长度大于1则循环
while(queue.size() > 1) {
// 将number前面的人整体移动到队尾
for(let i = 0;i < number - 1;i++) {
queue.enqueue(queue.dequeue())
}
// 将下标为number的人出队
queue.dequeue()
}
return queue.front()
}
// passGame() 测试
const names = ["lily", "lucy", "tom", "tony", "jack"];
const targetIndex = passGame(names, 4);
console.log("击鼓传花", targetIndex); //--> lily
Leetcode题目
- 933. 最近的请求次数
- 387. 字符串中的第一个唯一字符
- 使用两个栈实现队列 LCR 125. 图书整理 II