ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

js数据结构与算法-队列的实现和击鼓传花案例

2022-08-19 15:33:11  阅读:145  来源: 互联网

标签:return 队列 items .# js 传花 lowestCount 数据结构


队列的实现

和栈的实现相似,但是这里使用对象的方式,对象的key是数字的实现,类似数组。

/**
   * 队列
   */
class Queue {
  #count = 0; //队列最大数量
  #lowestCount = 0; //目前第一个元素的下标
  #items = {}; //队列
  constructor() { }
  //增加元素
  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;
  }
  //队列是否为空
  isEmpty() {
    // return this.#count - this.#lowestCount === 0;
    return this.size() === 0;
  }
  //查看队列头元素
  peek() {
    if (this.isEmpty()) {
      return undefined;
    }
    return this.#items[this.#lowestCount];
  }
  //队列中有几个元素
  size() {
    return this.#count - this.#lowestCount;
  }
  //清空队列
  clear() {
    this.#count = 0;
    this.#lowestCount = 0;
    this.#items = {};
  }
  //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;
  }
}

const q1 = new Queue()
q1.enqueue(1)
q1.enqueue(2)
q1.enqueue(3)
q1.dequeue()
console.log(q1)

这里新增3个元素,删除一个元素。

返回q1的值:

 

实际击鼓传花:

游戏规则:一些人围成一圈,开始一个个传花,传花n次(可多可少),单次结束时,淘汰收到花的人,之后从下个人继续,以此类推。到最后剩余一人结束。

使用队列实现过程:

//击鼓传花
function hotPotato(elementsList) {
  const queue = new Queue();
  const elimitatedList = [];//移除了的人
  for (let i = 0; i < elementsList.length; i++) {
    queue.enqueue(elementsList[i]);
  }
  while (queue.size() > 1) {
    //传花中
    const num = Math.round(Math.random() * 5 + 5)//传花次数 随机5-10次
    for (let i = 0; i < num; i++) {
      queue.enqueue(queue.dequeue());//移除1人并添加1人 拿到花的是第一个 送出花的是最后一个 形成传递圈
    }
    let ycitem = queue.dequeue();//本次移除的人
    elimitatedList.push(ycitem);
    console.log('传花次数', num, '被淘汰人员', ycitem)
  }
  console.log('胜者', queue.dequeue())
}

hotPotato(['赵大', '钱二', '张三', '李四', '王五'])

结果打印:

 

标签:return,队列,items,.#,js,传花,lowestCount,数据结构
来源: https://www.cnblogs.com/wuhairui/p/16596344.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有