Javascript 数组实现队列及应用
普通队列
/*
普通队列
enqueue(element) 向队列尾部添加一个(或多个)新的元素
dequeue() 移除队列第一个元素(排在最前面的元素)并返回 被移除的元素
front() 返回队列第一个元素 不做修改队列操作 (类似于Stack的peek)
isEmpty() 如果队列中没有元素 return true 否则 return false
size() 返回队列中元素个数
toString() 将队列内容转化为字符串形式
*/
function Queue() {
this.items = []
}
Queue.prototype.enqueue = function(element) {
this.items.push(element)
}
Queue.prototype.dequeue = function() {
return this.items.shift()
}
Queue.prototype.isEmpty = function() {
return this.items.length === 0 ? true : false
}
Queue.prototype.front = function() {
return this.items[0]
}
Queue.prototype.size = function() {
return this.items.length
}
Queue.prototype.toString = function() {
return this.items.toString()
}
队列的应用 >> 报数
游戏规则: 若干个人围成一圈报数,当报到指定数字(number)的时候淘汰该人,
最后剩下的人获胜。
/*
LastWinner --最后剩下的人
游戏规则:
若干个人围成一个圈
随机喊一个数 n
从第一个人开始报数 报到随机数n时 淘汰报到n的人
随机数重置为1
options1: 人名数组 nameList
options2: 报到第n个数的人淘汰(淘汰依据)
返回值: 获胜人名字
*/
function LastWinner(nameList,number) {
let q1 = new Queue()
// 1.将名字排成一个队列
for (let i=0; i< nameList.length; i++) {
q1.enqueue(nameList[i])
}
let index = 1 // 定义淘汰依据
// 2.开始报数 循环结束条件: 当只剩最后一人
while(q1.size() > 1) {
if (index % number === 0) {
q1.dequeue()// 如果报数到了指定数 淘汰报到数的人(淘汰位置在第一的人)
index = 1 // 淘汰了则 重置index
} else {
q1.enqueue(q1.dequeue()) // 没有淘汰 将第一个人放到最后重新排入队列参与报数
index ++ // 没有淘汰则 index++
}
}
// 执行到这 说明只剩最后一个人
// 3.将剩下的最后一个人的名字return
return q1.front()
}
报数测试
/*
options1: 人名数组 nameList
options2: 报到第n个数的人淘汰(淘汰依据)
*/
let nameList = ['小A','小B','小C','小D','小E']
let winner = LastWinner(nameList,5)// 报数报到5的人淘汰
console.log(winner) // 最后剩下的是 小B