队列是一种遵从先进先出(FIFO)的有序集合
生活中最常见的案例就是 排队
普通队列
- enqueue(element(s)):向队列尾部添加一个(或多个)新的项
- dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素
- front():返回队列中第一个元素——最先被添加,也将是最先被移除的元素。
- isEmpty():如果队列中不包含任何元素,返回true,否则返回false
- size():返回队列包含的元素个数,与数组的length属性类似
class Queue {
constructor() {
this.items = [];
}
enqueue(...args) {
this.items.push(...args)
}
dequeue() {
return this.items.shift();
}
front() {
return this.items[0];
}
isEmpty() {
return this.items.length === 0;
}
size() {
return this.items.length;
}
}
优先级队列
顾名思义:队列中的某项要优先处理
- 等舱和商务舱乘客的优先级要高于经济舱乘客
- 医生先处理病情严重的患者
- VIP 优先 普通人
- 等等......
实现方式:(这里我们实现第一种方式,感兴趣可自行实现第二种)
- 入队直接放,出队找最大(优先级最高)元素。
- 入队时排号队,出队按顺序出
class Queue {
constructor() {
this.items = [];
}
enqueue(value) {
this.items.push(value);
}
dequeue() {
let maxIndex = 0, // 保存优先级最高
index;
this.items.forEach((v, i) => {
if(v.zIndex > maxIndex) {
maxIndex = v.zIndex;
index = i;
}
})
return this.items.splice(index, 1);
}
// ......
}
循环队列——击鼓传花
function hotPotato (nameList, num) {
var queue = new Queue();
nameList.forEach(name => queue.enqueue(name));
var eliminated = '';
while (queue.size() > 1){
for(let i = 0; i < num; i++) {
queue.enqueue(queue.dequeue()); // 将第一项剪切到末尾
}
queue.dequeue(); // 删除第一项
}
return queue.items[0];
}
var names = ['Tom','Jack','Sally','Frank','Lucy'];
var winner = hotPotato(names, 7);
console.log('胜利者:' + winner);