Javascript 数组实现队列及应用

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
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值