数据结构 - 队列

126 阅读2分钟

认识队列

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

受限之处:

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

队列图解

image

队列的应用场景

  • 食堂排队打饭
  • JS异步任务中的队列

队列的实现

队列的实现和栈一样,有两种方案:

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

队列常见的操作

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

代码实现

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
    }

    // 将队列中的内容,转成字符串形式
    toString() {
        let str = ''
        for (let item of this.items) {
            str += item + ' '
        }
        return str
    }
}

测试代码

const queue = new Queue();

// enqueue() 测试
queue.enqueue("a");
queue.enqueue("b");
queue.enqueue("c");
queue.enqueue("d");
console.log(queue.items); //--> ["a", "b", "c", "d"]

// dequeue() 测试
queue.dequeue();
queue.dequeue();
console.log(queue.items); //--> ["c", "d"]

// front() 测试
console.log(queue.front()); //--> c

// isEmpty() 测试
console.log(queue.isEmpty()); //--> false

// size() 测试
console.log(queue.size()); //--> 2

// toString() 测试
console.log(queue.toString()); //--> c d

队列的应用

使用队列实现小游戏:击鼓传花

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

代码实现

function passGame(nameList, number) {
    // 创建一个队列
    const queue = new Queue();
    for(let item of nameList) {
        queue.enqueue(item)
    }

    // 如果队列的长度大于1则循环
    while(queue.size() > 1) {
        // 将number前面的人整体移动到队尾
        for(let i = 0;i < number - 1;i++) {
            queue.enqueue(queue.dequeue())
        }

        // 将下标为number的人出队
        queue.dequeue()
    }

    return queue.front()
}

// passGame() 测试
const names = ["lily", "lucy", "tom", "tony", "jack"];
const targetIndex = passGame(names, 4);
console.log("击鼓传花", targetIndex); //--> lily

Leetcode题目

  1. 933. 最近的请求次数
  2. 387. 字符串中的第一个唯一字符
  3. 使用两个栈实现队列 LCR 125. 图书整理 II