由于队列经常被应用在计算机领域和我们的现实生活中,就出现了一些队列的修改版,其中一种叫做循环队列。
循环队列的一个例子就是击鼓传花游戏。
在这个游戏中,孩子们围成一个圆圈,把花尽快的传递给旁边的人。某一个时刻传花停止,这个时候花在谁手里,谁就退出圆圈,
结束游戏。不断重复这个过程,直到只剩下一个孩子(胜利者)。
我们利用队列来实现一下这个游戏
思路:
创建出一个队列对象【1】
我们会得到一个名单,将里面的名字全部放到队列中去【2】
给定一个数组,然后迭代队列,从队列开头移除一项,然后再添加到末尾中去【3】
模拟击鼓传花(如果你把花给了旁边的人,你被淘汰的威胁就解除了)一旦达到给定的传递次数,拿着花的人就被淘汰了【4】
最后剩下一个人的时候,就是胜利者【5】
class Queue {
constructor() {
this.count = 0; //最新的
this.lowestCount = 0; //最旧的
this.items = {};
}
// 向队列添加元素
enqueue(element) {
this.items[this.count] = element;
this.count++;
}
// 从队列中移除元素
dequeue() {
if (this.isEmpty()) {
return undefined;
}
const result = this.items[this.lowestCount];
delete this.items[this.lowestCount];
this.lowestCount++;
return result;
}
// 查看队列的第一个元素
peek() {
if (this.isEmpty()) {
return undefined;
}
return this.items[this.lowestCount];
}
// 查看队列是否为空
isEmpty() {
return this.count - this.lowestCount === 0;
}
// 查看队列有多少数据
size() {
return this.count - this.lowestCount;
}
// 清空队列
clear() {
this.items = {};
this.count = 0;
this.lowestCount = 0;
}
// toString方法
toString() {
if (this.isEmpty()) {
return "";
}
let objString = `${this.items[this.lowestCount]}`;
for (let i = this.lowestCount + 1; i < this.count; i++) {
objString = `${objString},${this.items[i]}`;
}
return objString;
}
}
function hotPotato(elementsList, num) {
const queue = new Queue(); //【1】
const loserList = [];
for (let i = 0; i < elementsList.length; i++) {
queue.enqueue(elementsList[i]); //【2】
}
while (queue.size() > 1) {
for (let i = 0; i < num; i++) {
queue.enqueue(queue.dequeue()); //【3】
}
loserList.push(queue.dequeue()); //【4】
}
return {
loser: loserList,
winner: queue.dequeue(), //【5】
};
}