The Algorithms logo
算法
关于我们捐赠

队列

P
/* Queue
 * A Queue is a data structure that allows you to add an element to the end of
 * a list and remove the item at the front. A queue follows a FIFO (First In First Out)
 * system, where the first item to enter the queue is the first to be removed,
 * All these operation complexities are O(1).
 * This implementation following the linked list structure.
 */

class Queue {
  #size

  constructor() {
    this.head = null
    this.tail = null
    this.#size = 0

    return Object.seal(this)
  }

  get length() {
    return this.#size
  }

  /**
   * @description - Add a value to the end of the queue
   * @param {*} data
   * @returns {number} - The current size of queue
   */
  enqueue(data) {
    const node = { data, next: null }

    if (!this.head && !this.tail) {
      this.head = node
      this.tail = node
    } else {
      this.tail.next = node
      this.tail = node
    }

    return ++this.#size
  }

  /**
   * @description - Removes the value at the front of the queue
   * @returns {*} - The first data of the queue
   */
  dequeue() {
    if (this.isEmpty()) {
      throw new Error('Queue is Empty')
    }

    const firstData = this.peekFirst()

    this.head = this.head.next

    if (!this.head) {
      this.tail = null
    }

    this.#size--

    return firstData
  }

  /**
   * @description - Return the item at the front of the queue
   * @returns {*}
   */
  peekFirst() {
    if (this.isEmpty()) {
      throw new Error('Queue is Empty')
    }

    return this.head.data
  }

  /**
   * @description - Return the item at the tail of the queue
   * @returns {*}
   */
  peekLast() {
    if (this.isEmpty()) {
      throw new Error('Queue is Empty')
    }

    return this.tail.data
  }

  /**
   * @description - Return the array of Queue
   * @returns {Array<*>}
   */
  toArray() {
    const array = []
    let node = this.head

    while (node) {
      array.push(node.data)
      node = node.next
    }

    return array
  }

  /**
   * @description - Return is queue empty or not
   * @returns {boolean}
   */
  isEmpty() {
    return this.length === 0
  }
}

export default Queue
关于此算法

描述

队列是一种遵循先进先出 (FIFO) 原则的线性数据结构。它通常被比作现实生活中排队等候的人群。最先添加的元素是最先被移除的元素。队列通常用于各种应用程序,例如任务调度、管理请求等等。

队列操作

  1. 入队 (Push):此操作用于将项目添加到队列的尾部或末尾。它相当于将项目“推入”队列。当您入队一个项目时,它成为队列中的最后一个项目。

  2. 出队 (Pop):出队是用于移除并返回队列中第一个项目的操作。在队列中停留时间最长的项目(第一个项目)是将被移除的项目。出队一个项目后,队列中的下一个项目成为新的第一个项目。

  3. 查看 (Front):此操作用于查看队列中的第一个项目,而不将其移除。它提供了一种检查队列前端项目的方法,而无需实际将其出队。

  4. isEmpty:此操作检查队列是否为空。如果队列不包含任何项目,则返回 true;否则,返回 false。

来源

视频 URL

实现

  1. 使用列表(数组)实现队列

在这种方法中,您可以使用列表(或数组)来表示队列。您将维护两个指针,一个指向队列的前面,另一个指向队列的后面。前端指针跟踪要出队的元素,后端指针跟踪应将新元素入队的位置。

  1. 使用链表实现队列

在这种方法中,您可以使用链表来实现队列。您将维护两个指针,一个指向队列的前端(头部),另一个指向队列的后端(尾部)。入队涉及在尾部添加一个新节点,出队涉及移除头部的节点。