编程语言
首页 > 编程语言> > js数据结构与算法-队列的实现和击鼓传花案例

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

作者:互联网

队列的实现

和栈的实现相似,但是这里使用对象的方式,对象的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