返回

图解队列结构(Queue),这篇文章想让你眼前一亮!

前端

队列是一种先进先出(FIFO)的数据结构,它与栈类似,但它们之间存在一些关键差异。栈遵循后进先出(LIFO)原则,这意味着最后添加的元素将首先被删除。而队列遵循先进先出(FIFO)原则,这意味着最早添加的元素将首先被删除。

队列在计算机科学中有着广泛的应用,例如:

  • 在操作系统中,队列用于管理进程和线程。
  • 在网络协议中,队列用于存储数据包。
  • 在数据库系统中,队列用于存储查询请求。
  • 在多媒体应用中,队列用于存储音频和视频数据。

队列的实现有很多种,最常见的是使用数组或链表。

  • 使用数组实现的队列
class Queue {
  constructor() {
    this.items = [];
  }

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

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

  front() {
    return this.items[0];
  }

  isEmpty() {
    return this.items.length === 0;
  }
}
  • 使用链表实现的队列
class Queue {
  constructor() {
    this.head = null;
    this.tail = null;
  }

  enqueue(item) {
    const node = {
      data: item,
      next: null,
    };

    if (this.head === null) {
      this.head = node;
      this.tail = node;
    } else {
      this.tail.next = node;
      this.tail = node;
    }
  }

  dequeue() {
    if (this.head === null) {
      return null;
    }

    const item = this.head.data;
    this.head = this.head.next;

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

    return item;
  }

  front() {
    if (this.head === null) {
      return null;
    }

    return this.head.data;
  }

  isEmpty() {
    return this.head === null;
  }
}

队列的时间复杂度

操作 时间复杂度
enqueue O(1)
dequeue O(1)
front O(1)
isEmpty O(1)

队列的空间复杂度

操作 空间复杂度
enqueue O(n)
dequeue O(n)
front O(1)
isEmpty O(1)

队列的优缺点

优点 缺点
先进先出 空间复杂度高
实现简单 时间复杂度高
应用广泛 不支持随机访问

队列的拓展知识

  • 双向队列

双向队列(Deque)是一种允许从两端添加和删除元素的队列。它与标准队列类似,但它提供了更多的灵活性。双向队列可以在两端添加和删除元素,而标准队列只能从一端添加和删除元素。

  • 输出受限队列

输出受限队列(Bounded Queue)是一种只能从一端添加和删除元素的队列。它与标准队列类似,但它限制了队列的大小。当队列已满时,不能再向队列中添加元素。

  • 输入受限队列

输入受限队列(Unbounded Queue)是一种可以从两端添加和删除元素的队列。它与标准队列类似,但它允许队列的大小无限增长。

  • 优先队列

优先队列(Priority Queue)是一种根据元素的优先级来处理元素的队列。优先队列中的元素具有优先级,优先级高的元素将首先被处理。优先队列常用于任务调度和资源分配。

希望这篇图解文章对您有所帮助。如果您有任何问题或建议,请随时留言。