返回

解锁 JavaScript 双端队列的奥秘:征服 LeetCode 第 641 题

前端

一、前言:队列的奥秘

队列,一种遵循先进先出(FIFO)原则的数据结构,在计算机科学领域扮演着举足轻重的角色。它就好比生活中的排队,先到的人先得到服务。在 JavaScript 中,我们可以轻松使用 Array 类型的队列来模拟这一行为。

二、双端队列:超越 FIFO

双端队列(Deque),也称作双端循环队列,它与普通队列有着本质的区别。双端队列不仅可以在队首进行插入和删除操作,更可以在队尾执行同样的操作。这种双向操作的灵活性使其在实际应用中大显身手。

三、LeetCode 第 641 题:实战演练

LeetCode 第 641 题正是考察我们对双端队列的理解和应用能力。题目要求我们实现一个名为 MyCircularDeque 的类,它具备以下功能:

  • 初始化队列,指定队列的容量
  • 在队首和队尾插入元素
  • 在队首和队尾删除元素
  • 获取队首元素
  • 获取队尾元素
  • 判断队列是否为空

四、解题步骤:循序渐进

  1. 定义私有变量:

    • 创建一个数组来存储元素
    • 初始化 head 和 tail 指针指向数组首尾
  2. 插入元素:

    • 队首插入:将元素添加到数组首部,head 指针后移
    • 队尾插入:将元素添加到数组尾部,tail 指针后移
  3. 删除元素:

    • 队首删除:head 指针后移,移除数组首部的元素
    • 队尾删除:tail 指针前移,移除数组尾部的元素
  4. 获取元素:

    • 获取队首元素:返回数组中 head 指针指向的元素
    • 获取队尾元素:返回数组中 tail 指针指向的元素
  5. 判断队列是否为空:

    • head 和 tail 指针指向同一位置

五、代码实现:清晰易懂

class MyCircularDeque {
  constructor(k) {
    this.arr = new Array(k);
    this.head = 0;
    this.tail = 0;
  }

  insertFront(value) {
    if (this.isFull()) return false;

    this.head = (this.head - 1 + this.arr.length) % this.arr.length;
    this.arr[this.head] = value;

    return true;
  }

  insertLast(value) {
    if (this.isFull()) return false;

    this.arr[this.tail] = value;
    this.tail = (this.tail + 1) % this.arr.length;

    return true;
  }

  deleteFront() {
    if (this.isEmpty()) return false;

    this.head = (this.head + 1) % this.arr.length;
    return true;
  }

  deleteLast() {
    if (this.isEmpty()) return false;

    this.tail = (this.tail - 1 + this.arr.length) % this.arr.length;
    return true;
  }

  getFront() {
    if (this.isEmpty()) return -1;
    return this.arr[this.head];
  }

  getRear() {
    if (this.isEmpty()) return -1;
    return this.arr[(this.tail - 1 + this.arr.length) % this.arr.length];
  }

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

  isFull() {
    return (this.tail + 1) % this.arr.length === this.head;
  }
}

六、结语:融会贯通

通过征服 LeetCode 第 641 题,我们不仅掌握了双端队列的实现原理,更深入理解了队列这一数据结构的本质。双端队列的灵活特性使其在实际应用中大有可为,例如在浏览器历史记录、缓存管理等场景中都发挥着重要的作用。

希望这篇文章能够为您的编程之旅提供帮助。如果您有任何疑问或建议,欢迎留言交流。