JavaScript数据结构与算法(6)队列的应用击鼓传花游戏

本文通过JavaScript讲解了如何使用循环队列模拟击鼓传花游戏。在游戏中,孩子们围成一圈传递花,当到达指定次数后,持有花的孩子出局,直至剩下最后一名胜者。该实现利用Queue类,将名字加入队列,根据次数迭代并调整队列,最终找出胜者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文章:https://www.cnblogs.com/xiaohuochai/p/8174854.html

循环队列-击鼓传花游戏

还有另一个修改版的队列实现,就是循环队列。循环队列的一个例子就是击鼓传花游戏(Hot Potato)。在这个游戏中,孩子们围成一个圆圈,把花尽快地传递给旁边的人。某一时刻传花停止, 这个时候花在谁手里,谁就退出圆圈结束游戏。重复这个过程,直到只剩一个孩子(胜者)。

//enqueue(element(s)):向队列尾部添加一个(或多个)新的项。
//dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。

function hotPotato(nameList,num){

	//新建一个队列
	var queue = new Queue(); // {1}

	for(let item of nameList){
		queue.enqueue(item); // {2}
	}

	var eliminated = '';

	while(queue.size>1){
		for (var i=0; i<num; i++){ 
			//从队列开头移除一项,再将其添加到队列末尾(这样就让一个普通的队列变成了循环队列)
			//我们并不是真的创建一个循环的队列,而是将普通的队列赋予操作【不断更换开头和结尾】,让她有类似循环队列的操作
      		queue.enqueue(queue.dequeue()); // {3}
    	}
    	eliminated = queue.dequeue();// {4} 
    	console.log(eliminated + '在击鼓传花游戏中被淘汰。');
  	}
 	return queue.dequeue();// {5}	

}

//测试代码
var names = ['John','Jack','Camila','Ingrid','Carl']; 
var winner = hotPotato(names, 7);
console.log('胜利者:' + winner);

实现一个模拟的击鼓传花游戏,要用到Queue类(行{1})。我们会得到一份名单,把里面的名字全都加入队列(行{2})。给定一个数字,然后迭代队列。从队列开头移除一项,再将其添加到队列末尾(行{3}),模拟击鼓传花(如果把花传给了旁边的人,被淘汰的威胁立刻就解除了)。一旦传递次数达到给定的数字,拿着花的那个人就被淘汰了(从队列中移除——行{4})。最后只剩下一个人的时候,这个人就是胜者(行{5}。

在这里插入图片描述

通过queue.dequeue()知道一直指向的是队列的第一个,然后通过循环,不断改变指向,但是可以认为是花位置不变,队列一直在循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值