返回
解锁 JavaScript 双端队列的奥秘:征服 LeetCode 第 641 题
前端
2023-09-09 05:06:27
一、前言:队列的奥秘
队列,一种遵循先进先出(FIFO)原则的数据结构,在计算机科学领域扮演着举足轻重的角色。它就好比生活中的排队,先到的人先得到服务。在 JavaScript 中,我们可以轻松使用 Array 类型的队列来模拟这一行为。
二、双端队列:超越 FIFO
双端队列(Deque),也称作双端循环队列,它与普通队列有着本质的区别。双端队列不仅可以在队首进行插入和删除操作,更可以在队尾执行同样的操作。这种双向操作的灵活性使其在实际应用中大显身手。
三、LeetCode 第 641 题:实战演练
LeetCode 第 641 题正是考察我们对双端队列的理解和应用能力。题目要求我们实现一个名为 MyCircularDeque 的类,它具备以下功能:
- 初始化队列,指定队列的容量
- 在队首和队尾插入元素
- 在队首和队尾删除元素
- 获取队首元素
- 获取队尾元素
- 判断队列是否为空
四、解题步骤:循序渐进
-
定义私有变量:
- 创建一个数组来存储元素
- 初始化 head 和 tail 指针指向数组首尾
-
插入元素:
- 队首插入:将元素添加到数组首部,head 指针后移
- 队尾插入:将元素添加到数组尾部,tail 指针后移
-
删除元素:
- 队首删除:head 指针后移,移除数组首部的元素
- 队尾删除:tail 指针前移,移除数组尾部的元素
-
获取元素:
- 获取队首元素:返回数组中 head 指针指向的元素
- 获取队尾元素:返回数组中 tail 指针指向的元素
-
判断队列是否为空:
- 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 题,我们不仅掌握了双端队列的实现原理,更深入理解了队列这一数据结构的本质。双端队列的灵活特性使其在实际应用中大有可为,例如在浏览器历史记录、缓存管理等场景中都发挥着重要的作用。
希望这篇文章能够为您的编程之旅提供帮助。如果您有任何疑问或建议,欢迎留言交流。