利用JS实现循环队列--击鼓传花游戏

本文介绍如何使用循环队列模拟现实中的击鼓传花游戏,通过创建Queue类实现元素的进出,并在给定次数的传递后确定赢家。

由于队列经常被应用在计算机领域和我们的现实生活中,就出现了一些队列的修改版,其中一种叫做循环队列。

循环队列的一个例子就是击鼓传花游戏。

在这个游戏中,孩子们围成一个圆圈,把花尽快的传递给旁边的人。某一个时刻传花停止,这个时候花在谁手里,谁就退出圆圈,
结束游戏。不断重复这个过程,直到只剩下一个孩子(胜利者)。

我们利用队列来实现一下这个游戏

思路:

创建出一个队列对象【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】
	};
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值