概述
队列(Queue)是受限的线性结构,先进先出(FIFO)。
队列ES6实现:
class Queue {
// 属性
constructor() {
this.items = []
}
// 方法
enqueue(element) {
this.items.push(element)
}
dequeue() {
return this.items.shift()
}
// 查看第一个元素
front() {
return this.items.length === 0?null:this.items[0];
}
isEmpty() {
return this.items.length === 0;
}
size() {
return this.items.length
}
}
使用:
let queue = new Queue()
queue.enqueue(2)
queue.enqueue(4)
queue.enqueue(6)
console.log(queue.dequeue()); // 2
console.log(queue.front()); // 4
console.log(queue.isEmpty()); // false
console.log(queue.size()); // 2
常见面试题:
击鼓传花:一群人围成圈,排数排到谁,谁就被淘汰,最终留下的人获胜。
function passGame(nameList, num) {
const queue = new Queue()
for (let i = 0; i < nameList.length; i++) {
queue.enqueue(nameList[i])
}
// 最后剩下的那个人赢了
while (queue.size() > 1) {
for (let i = 0; i < num - 1; i++) {
queue.enqueue(queue.dequeue())
}
queue.dequeue()
}
return queue.front()
}
console.log(passGame(['张三', '李四', '王五', '留六'], 3)); // 张三
优先级队列
考虑数据的优先级。
即插入元素时考虑优先级。
class QueueElement {
constructor(element, priority) {
this.element = element;
this.priority = priority
}
}
class PriorityQueue extends Queue{
enqueue(element, priority) {
const queueElement = new QueueElement(element, priority)
if (this.isEmpty()) {
this.items.push(queueElement)
} else {
let added = false;
for (let i = 0; i < this.items.length; i++) {
if (this.items[i].priority > queueElement.priority) {
this.items.splice(i, 0, queueElement);
added = true;
break;
}
}
// 遍历完仍没有找到则插入到最后
if (!added) {
this.items.push(queueElement)
}
}
}
}
使用:
const queue = new PriorityQueue()
queue.enqueue('aaa', 100);
queue.enqueue('bbb', 120);
queue.enqueue('ccc', 90);
queue.enqueue('ddd', 125);
queue.items.forEach(value => console.log(value.element))
运行结果: