乐趣区

关于前端:JavaScript-数据结构与算法队列

队列(Queue)是一种运算受限的线性表,特点:先进先出。(FIFO:First In First Out)

受限之处:

  • 只容许在表的前端(front)进行删除操作。
  • 只容许在表的后端(rear)进行插入操作。

队列在程序中的利用

  • 打印队列:计算机打印多个文件的时候,须要排队打印。
  • 线程队列:当开启多线程时,当新开启的线程所需的资源有余时就先放入线程队列,期待 CPU 解决。

队列常见的操作

  • enqueue(element) 向队列尾部增加一个(或多个)新的项。
  • dequeue() 移除队列的第一(即排在队列最后面的)项,并返回被移除的元素。
  • front() 返回队列中的第一个元素——最先被增加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息与 Map 类的 peek 办法十分相似)。
  • isEmpty() 如果队列中不蕴含任何元素,返回 true,否则返回 false。
  • size() 返回队列蕴含的元素个数,与数组的 length 属性相似。
  • toString() 将队列中的内容,转成字符串模式。

代码实现

class Queue {constructor() {this.items = [];
 }

 enqueue(item) {this.items.push(item)
 }

 dequeue() {return this.items.shift()
 }

 front() {return this.items[0]
 }
 
 isEmpty() {return this.item.length === 0}
 
 // size() 查看队列中元素的个数
 size() {return this.items.length}
 
 // toString() 将队列中的元素以字符串模式返回
 toString() {
  let result = ''
  for (let item of this.items) {result  += item + ' '}
  return result
 }
}

击鼓传花

剖析:传入一组数据汇合和设定的数字 number,循环遍历数组内元素,遍历到的元素为指定数字 number 时将该元素删除,直至数组剩下一个元素。

function queueGame(nameList, number) {const queue = new Queue();
 
 for (const name of nameList) {queue.enqueue(name)
 }

 while (queue.size() > 1) {for (let i = 0; i < number - 1; i++) {queue.enqueue(queue.dequeue());
  }
  queue.dequeue();}
 
 const endName = queue.front()
 
 return nameList.indexOf(endName)
}
退出移动版