数据结构与算法(三)队列

268 阅读2分钟

队列简介

队列(Queue)是一种受限的线性表,特点是先进先出(FIFO first in first out)

受限之处

  • 只允许在队列的最前面(front删除
  • 只允许在队列的末尾rear处插入

图文并茂

image.png

队列图解

image.png

队列在程序中的应用

  • 打印队列:当计算机打印多个文件的时候需要排队打印
  • 线程队列:当开启多线程时,当新开启的线程所需的资源不足时就先放入线程队列,等待CPU处理。

队列的实现

  • 基于数组实现
  • 基于链表实现

队列常见的操作

  • enqueue(element)向队列尾部添加一个或多个元素。
  • dequeue()移除队列最前面的元素,并返回被移除的元素。
  • front()返回队列中最前面的元素,队列不做任何变动。
  • isEmpty() 检测队列是否为空。
  • size() 返回队列中元素的个数。
  • print() 打印队列中的元素值。

代码实现

//队列可以抽象成生活中的排队

//先进先出
class Queue {

  constructor() {
    this.items = []
  }


  //入队
  enqueue(element) {
    this.items.push(element)
  }

  //出队

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


  //找出队头元素
  front() {
    return this.items[0]
  }

  //查看队列是否为空
  isEmpty() {
    return this.items.length === 0
  }

  //查看队列元素长度
  size() {
    return this.items.length
  }

  //打印队列元素
  print() {
    return this.items.join(" ")
  }
}
module.exports = Queue

测试代码

const Queue = require('./queue')
// 测试代码

let queue = new Queue()

queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
queue.enqueue(4)
queue.enqueue(5)

console.log(queue.print())

一个应用

题目:击鼓传花

有五个人A,B,C,D,E,F 围成一个圈,每次数到5的时候,从里面把这个人移除,直到圈里面只剩下一个人游戏结束

function passGame(data, num) {

  //先将圈里面的人依次入队

  let queue = new Queue()

  data.forEach(element => {
    queue.enqueue(element)
  });

  while (queue.size() > 1) {
    //没数到之前的人的处理方法,把没数到的人重新拿出来放到队列的尾部,直到被数到为止。
    for (let i = 0; i < num - 1; i++) {
      queue.enqueue(queue.dequeue())
    }
    queue.dequeue()
  }

  return queue.front()
}

console.log(passGame(['lily', 'lucy', 'tom', 'tony', 'jack'],4))