数据结构-队列

173 阅读2分钟

「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战

队列

介绍

队列 是数据结构的基本知识之一,在实际的项目中应用场景很多,这里做一个相关的总结。

队列 的示意图:

image.png

简介

队列先进先出, 后进后出 的一种方式,例如生活中有很多的例子: 排队结账,排队取票,排队进游乐园等等,都是 先进先出 的生活应用。

队列 是在队尾 来进行 插入元素的操作,而在队顶 来进行 删除元素的操作。

队列 (Queue) 的操作方式有:

  • 入队(enqueue)

    在队尾 插入一个新的元素

  • 出队(dequeue)

    将队顶元素进行移除

  • 返回队顶(front)

    返回队顶的元素,但不移除

  • 队列是否为空(isEmpty)

    判断队列里是否为空

  • 队列中元素数量(size)

    返回 队列 里面元素的数量

  • 清空(clear)

    清空队列内所有的元素

代码

    class Queue {
      constructor() {
        this.arr = [10,20,30]
      }

      enqueue(element) {
        this.arr.push(element)
      }

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

      front() {
        if (this.isEmpty()) return null
        return this.arr[0]
      }

      isEmpty() {
        return this.arr.length === 0
      }

      size() {
        return this.arr.length
      }
      
      find(index) {
        return this.arr[index]
      }

      clear() {
        this.arr = []
      }
    }
    const queue = new Queue()

    queue.enqueue(12)
    console.log(queue.arr)
    console.log(queue.dequeue())
    console.log(queue.arr)
    console.log(queue.front())
    console.log(queue.arr)
    console.log(queue.isEmpty())
    console.log(queue.arr)
    console.log(queue.size())
    console.log(queue.arr)
    console.log(queue.find(1))
    console.log(queue.arr)
    queue.clear()
    console.log(queue.arr)

得到的结果为:

    [ 10, 20, 30, 12 ]
    10
    [ 20, 30, 12 ]
    20
    [ 20, 30, 12 ]
    false
    [ 20, 30, 12 ]
    3
    [ 20, 30, 12 ]
    30
    [ 20, 30, 12 ]
    []

例子

经典的 队列 来解决的例子

239 滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 。

示例 1:

输入: nums = [1,3,-1,-3,5,3,6,7], k = 3
输出: [3,3,5,5,6,7]

注意这道题主要在,如何判断里面的最大值,和每次入队前,先判断是否超出,超出则先出队,再入队。循环比较得到最大值,最后在进行push最大值到 结果数组中。

结果代码

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

      enqueue(element) {
        this.arr.push(element)
      }

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

      front() {
        if (this.isEmpty()) return null
        return this.arr[0]
      }

      isEmpty() {
        return this.arr.length === 0
      }

      size() {
        return this.arr.length
      }

      find(index) {
        return this.arr[index]
      }

      clear() {
        this.arr = []
      }

    }
    const queue = new Queue()
    const nums = [1, 3, -1, -3, 5, 3, 6, 7, 1, 1, 1]
    const maxSlidingWindow = (nums, k) => {
      const res = []
      const numsLength = nums.length

      if (k > numsLength || k <= 0) return []

      for (let i = 0; i < numsLength; i++) {
        // 先删除离开窗口的元素
        if (queue.front() === nums[i - k]) queue.dequeue()

        // 进行入队操作 
        queue.enqueue(nums[i])

        // 若 index+1 小于 数组里的值,且队列里 index 下标的值  小于 将要传入的值时
        let index = 0
        let temp = queue.front()
        while (index + 1 < queue.size()) {
          if (queue.find(index) < queue.find(index + 1)) {
            temp = queue.find(index + 1)
          }
          index++
        }

        // 推入最大值
        if (i >= k - 1) res.push(temp)
      }
      return res
    }

总结

队列 是基础的数据结构,它的一个方式是 先进先出 。

  • 队尾 插入元素

  • 队顶 删除元素。