队列简介
队列(Queue)是一种受限的线性表,特点是先进先出(FIFO first in first out)
受限之处
- 只允许在队列的最前面
(front删除 - 只允许在队列的末尾
rear处插入
图文并茂
队列图解
队列在程序中的应用
- 打印队列:当计算机打印多个文件的时候需要排队打印
- 线程队列:当开启多线程时,当新开启的线程所需的资源不足时就先放入线程队列,等待CPU处理。
队列的实现
- 基于数组实现
- 基于链表实现
队列常见的操作
enqueue(element)向队列尾部添加一个或多个元素。dequeue()移除队列最前面的元素,并返回被移除的元素。front()返回队列中最前面的元素,队列不做任何变动。isEmpty()检测队列是否为空。size()返回队列中元素的个数。print()打印队列中的元素值。
代码实现
//队列可以抽象成生活中的排队
//先进先出
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
}
//打印队列元素
print() {
return this.items.join(" ")
}
}
module.exports = Queue
测试代码
const Queue = require('./queue')
// 测试代码
let queue = new Queue()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
queue.enqueue(4)
queue.enqueue(5)
console.log(queue.print())
一个应用
题目:击鼓传花
有五个人A,B,C,D,E,F 围成一个圈,每次数到5的时候,从里面把这个人移除,直到圈里面只剩下一个人游戏结束
function passGame(data, num) {
//先将圈里面的人依次入队
let queue = new Queue()
data.forEach(element => {
queue.enqueue(element)
});
while (queue.size() > 1) {
//没数到之前的人的处理方法,把没数到的人重新拿出来放到队列的尾部,直到被数到为止。
for (let i = 0; i < num - 1; i++) {
queue.enqueue(queue.dequeue())
}
queue.dequeue()
}
return queue.front()
}
console.log(passGame(['lily', 'lucy', 'tom', 'tony', 'jack'],4))