概念
首先,了解队列
队列遵循**先进先出(FIFO),**最常见的例子就是排队。最新添加要在末尾。
创建队列
我们创建一个类表示队列:
class Queue {
constructor(){
this.count = 0
this.lowestCount = 0
this.items = { }
}
}
那么,接下来我们介绍一下队列可用的方法:
enqueue() | 向队列末尾添加一个(或多个)新的项 | ||
---|---|---|---|
dequeue() | 移除队列的第一项并返回被溢出的元素 | ||
peek() | 返回队列中第一个元素,也就是最先被添加的。只返回,不移除。类似于front | ||
isEmpty() | 判断队列中是否有元素 | ||
size() | 返回元素个数。类似于length |
然后,我们给之前声明的类添加方法:
class Queue {
constructor() {
this.items = [];
}
//进队,从队的尾部进入
enqueue(value) {
this.items.push(value);
}
//出队,从队的头部出
dequeue() {
return this.items.shift();
}
//获取队中的第一个元素
front() {
return this.items[0];
}
//判断队是否为空
isEmpty() {
return this.items.length === 0;
}
//获取队中元素的个数
size() {
return this.items.length;
}
}
至此,Quene类的方法属性显而易见
解决问题:击鼓传花
介绍:一群人 围一圈 把花尽快的传递给旁边的人 停止在谁手上谁淘汰 直至最后一人获胜
//创建一个test方法来实现,传递参数
function test(elList, num) {
const queue = new Queue() //使用我们刚才出创建的Queue
const eledList = []
for (let i = 0; i < elList.length; i++) {
queue.enqueue(elList[i]) //获得一份玩家名单
}
while (queue.size() > 1) {
for (let i = 0; i < num; i++) {
queue.enqueue(queue.dequeue()) // 先移除一项,再添加至末尾
//模拟出 你传出去 即为 威胁消失
}
eledList.push(queue.dequeue()) //达到次数 就算淘汰
}
//否则即为获胜
return {
eliminated: eledList,
winner: queue.dequeue()
}
}
const names = [1, 2, 3, 4, 5]
const result = test(names, 7)
result.eliminated.forEach(name => {
console.log(`${name},被淘汰`);
})
console.log(`获胜者,${result.winner}`);