游戏规则:

民间击鼓传花游戏,也称传彩球。数人、十数人或数十人围成一个圆圈,把花尽快地传递给旁边的人。某一时刻传花停止,这个时候花在谁手里,谁就退圈、结束游戏。重复该过程,直到只剩一个人(胜利者)。

相信大家小时候都玩过击鼓传花小游戏,那么接下来,我们就代码实现理论与实际相结合。

概念介绍:

队列(Queue):队列是遵循先进先出(FIFO)原则的一组有序的项。队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排队队列中的末尾。像现实生活中的一条单行线,先进来的人会先出去。

双端队列(Deque):双端队列是一种允许我们从前端和后端同时添加和移除元素的特殊队列。常见应用是存储一系列的撤销操作。像现实生活中排队结账,排在第一位的人会先享受服务,离开后有需要咨询的问题,可以回头插入到第一位,继续询问,排在末尾的人,也可以选择直接离开。由于双端队列同时遵守了先进先出和后进后出原则,可以说它是队列和栈相结合的一种数据结构。

代码实现:

基于数组封装队列类

function Queue() {// 属性this.items = [];// 方法// 1.enqueue():将元素加入到队列中Queue.prototype.enqueue = (element) => {this.items.push(element);};// 2.dequeue():从队列中删除前端元素Queue.prototype.dequeue = () => {return this.items.shift();};// 3.front():查看前端的元素Queue.prototype.front = () => {return this.items[0];};// 4.isEmpty:查看队列是否为空Queue.prototype.isEmpty = () => {return this.items.length == 0;};// 5.size():查看队列中元素的个数Queue.prototype.size = () => {return this.items.length;};// 6.toString():将队列中元素以字符串形式输出Queue.prototype.toString = () => {let resultString = "";for (let i of this.items) {resultString += i + " ";}return resultString;};
}

击鼓传花游戏代码实现:

function hotPotato(elementsList, num) {const queue = new Queue();const elimitatedList = [];for (let i = 0; i < elementsList.length; i++) {queue.enqueue(elementsList[i]);}while (queue.size() > 1) {for (let i = 0; i < num; i++) {queue.enqueue(queue.dequeue());}elimitatedList.push(queue.dequeue());}return {eliminated: elimitatedList,winner: queue.dequeue(),};
}const names = ["summer", "sunny", "jake", "mickael", "winter"];
const result = hotPotato(names, 8);result.eliminated.forEach((name) => {console.log(`${name}在击鼓传花游戏中被淘汰`);
});console.log(`winner:${result.winner}`);

运行效果图如下:

参考书籍:《学习JavaScript数据结构与算法》

JavaScript通过队列和双端队列实现击鼓传花游戏相关推荐

  1. JS使用普通队列实现击鼓传花游戏

    最近复习到了数据结构中的普通队列部分,来实现一个击鼓传花游戏的应用. 循环队列的一个例子就是击鼓传花(hot potato),在这个游戏中,孩子们围成一个圆圈,把花尽快地传递给旁边的人.某一时刻传话停 ...

  2. 数据结构之队列、双端队列

    数据结构之队列.双端队列 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出的(First in First Out)的线性表,简称FIFO.允许插入的 ...

  3. java集合——队列和双端队列+优先级队列

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java集合--队列和双端队列+优先级队列 的相关知识: 0.2) for full sou ...

  4. 单向队列、双端队列、栈的模型实现

    引言 自己实现简单的队列.栈的逻辑结构. 队列都包含头和尾两个指针,简单的单向队列只能在一端(如:head端)入列,在另一端(如:tail 端)出列:双端队列可以在 head 进出,也可以在 tail ...

  5. python数据结构与算法——栈、队列与双端队列

    栈 栈:是一种容器,可存入数据元素.访问元素.删除元素,它的特点在于只能允许在容器的一端进行加入数据和输出数据的运算.没有了位置概念,保证任何时候可以访问.删除的元素都是此前最后存入的那个元素,确定了 ...

  6. 《恋上数据结构第1季》队列、双端队列、循环队列、循环双端队列

    队列(Queue) 队列 Queue 队列的接口设计 队列源码 双端队列 Deque 双端队列接口设计 双端队列源码 循环队列 Circle Queue 循环队列实现 索引映射封装 循环队列 – %运 ...

  7. java双端队列工作密取,同步器皿、并发容器、阻塞队列、双端队列与工作密取...

    同步容器.并发容器.阻塞队列.双端队列与工作密取 在多线程的开发中经常会碰到数据的并发修改,并发存取,因此正确的使用不同的容器很关键,直接影响到数据的正确性.下面主要记录下三种重要的队列,以及一种非常 ...

  8. apriori算法c++实现_经典数据结构与算法(四):Python/C/C ++实现队列类型双端队列数据结构...

    前期文章点击这里: 经典数据结构与算法(一):Python/C/C ++实现堆栈和队列 双端队列或双端队列是一种队列,其中可以从前面或后面执行元素的插入和删除.因此,它不遵循FIFO规则(先进先出). ...

  9. JavaScript队列结构——击鼓传花游戏

    JavaScript队列结构--击鼓传花游戏 //队列类 function Queue(){this.items = []//将元素添加到队列中Queue.prototype.enqueue = fu ...

最新文章

  1. 从零开始数据科学与机器学习算法-数据预处理与基准模型-01
  2. 网段:192.168.6.0的机器A要访问网段:10.1.56.0的机器B
  3. 第一个python爬虫_Python爬虫01——第一个小爬虫
  4. Spring 基础技术点
  5. jdbctemplate 开启事务_浅入浅出 Spring 事务传播实现原理
  6. PyTorch:tensor-基本操作
  7. 计算机专业的swot分析图,计算机专业学生个人SWOT分析案例
  8. Matlab中的两种曲线平滑函数
  9. php 同比增长率上期未0,同比增长率计算时,上期值为0怎么计算?
  10. 加密经济学应用的机制设计
  11. 基于51单片机万年历
  12. 算法训练Day6:有效的字母异位词, 两个数组的交集,快乐数,两数之和
  13. 永安行专利侵权胜诉,IPO并未搁置
  14. e420 thinkpad 开机黑屏_thinkpad E420开机黑屏主板门维修
  15. 计算机如何永久删除文件无法找回,电脑文件永久性删除了怎么办?简单五招教你恢复...
  16. RewriteCond 和RewriteRule
  17. 什么是随机对照双盲实验
  18. 【英语六级】【仔细阅读】(3)
  19. 2021-2022-2 ACM集训队每周程序设计竞赛(1) - 问题 D: 点外卖 - 题解
  20. ATX微机开关电源维修教程(典型)

热门文章

  1. 360 php SQL注入,从360提供的PHP防SQL注入代码改成的一个类
  2. 汇编语言数据传送指令之通用数据传送类指令
  3. Android 刻度表的实现
  4. H3C 研发员工作经历[转] 不忘初心方得始终!
  5. 比特承诺(Bit Commitment)的概念
  6. webm转换成mp4格式怎么转
  7. HDUnbsp;动态规划(46道题目)倾…
  8. kuka机器人外部轴配置方法
  9. Java中feign的独立使用
  10. 成绩录入时的及格与不及格人数统计的个人解法