gpt4 book ai didi

javascript - 如何在javascript中实现deque数据结构?

转载 作者:行者123 更新时间:2023-12-01 00:11:13 25 4
gpt4 key购买 nike

我正在使用 javascript 学习数据结构

我现在的重点是如何实现双端队列?

Edite: from comments below I get useful directions on how to implement deque based array. Is there a direction how to implement deque based object using class ?

enter image description here

我明白了一些我需要的要点:

  • addFront()
  • removeFront()
  • peekFront()
<小时/>
  • addBack()
  • removeBack()
  • peekBack()
<小时/>

但我对某些点感到困惑:

  • 我需要多少个指针?至少我从 queue 知道我需要两个(头尾)指针,但不确定在 deque 中是否需要更多指针

  • 在这种情况下,JavaScript 中哪种数据类型作为基础比较方便?我在 youtube 上看到一些导师在谈论圆形数组,例如我在 JS 中不知道的内容。

编辑2:

我正在关注一本书:学习 javascript 数据结构和算法第三版

在本书的第5章中,作者开始实现仅基于对象和一些变量的双端队列

但我不明白他是如何做到这一点的,因为代码已加密,但我仍然可以访问他的文件并测试他的方法 github repository

我可以说@trincot 的回答非常接近书籍作者的方法

但是当我比较结果时,我得到这个 [1 = 作者 - 2 = @trincot] : enter image description here

根据书籍索引,关于链表出现在第6章,所以我没想到他的解决方案会基于他之前没有提到的东西

如果我错过任何一点,我将不胜感激地告诉我......谢谢

最佳答案

如评论中所述,JavaScript 通过其 Array 类/原型(prototype)对双端队列操作提供 native 支持:push、pop、shift、unshift。

如果您仍然想编写自己的实现,那么您可以使用双向链表,其中只需要两个“指针”。应该说,在 JavaScript 中我们真正谈论的并不是指针,而是对象。获取对象作为值的变量或属性实际上是 JavaScript 中的引用。

或者,您可以选择圆形数组。由于在 JavaScript 标准数组中不能保证是连续数组(例如在 C 中的情况),因此您实际上不需要为此使用数组实例。一个普通的对象(或 map )就可以了。

这里有两种可能的实现:

双向链表

class Deque {
constructor() {
this.front = this.back = undefined;
}
addFront(value) {
if (!this.front) this.front = this.back = { value };
else this.front = this.front.next = { value, prev: this.front };
}
removeFront() {
let value = this.peekFront();
if (this.front === this.back) this.front = this.back = undefined;
else (this.front = this.front.prev).next = undefined;
return value;
}
peekFront() {
return this.front && this.front.value;
}
addBack(value) {
if (!this.front) this.front = this.back = { value };
else this.back = this.back.prev = { value, next: this.back };
}
removeBack() {
let value = this.peekBack();
if (this.front === this.back) this.front = this.back = undefined;
else (this.back = this.back.next).back = undefined;
return value;
}
peekBack() {
return this.back && this.back.value;
}
}

// demo
let deque = new Deque;
console.log(deque.peekFront()); // undefined
deque.addFront(1);
console.log(deque.peekBack()); // 1
deque.addFront(2);
console.log(deque.removeBack()); // 1
deque.addFront(3);
deque.addFront(4);
console.log(deque.peekBack()); // 2
deque.addBack(5);
deque.addBack(6);
console.log(deque.peekBack()); // 6
console.log(deque.removeFront()); // 4
console.log(deque.removeFront()); // 3
console.log(deque.removeFront()); // 2
console.log(deque.removeFront()); // 5
console.log(deque.removeFront()); // 6
console.log(deque.removeFront()); // undefined

循环“数组”

class Deque {
constructor() {
this.data = {}; // Or Array, but that really does not add anything useful
this.front = 0;
this.back = 1;
this.size = 0;
}
addFront(value) {
if (this.size >= Number.MAX_SAFE_INTEGER) throw "Deque capacity overflow";
this.size++;
this.front = (this.front + 1) % Number.MAX_SAFE_INTEGER;
this.data[this.front] = value;
}
removeFront() {
if (!this.size) return;
let value = this.peekFront();
this.size--;
delete this.data[this.front];
this.front = (this.front || Number.MAX_SAFE_INTEGER) - 1;
return value;
}
peekFront() {
if (this.size) return this.data[this.front];
}
addBack(value) {
if (this.size >= Number.MAX_SAFE_INTEGER) throw "Deque capacity overflow";
this.size++;
this.back = (this.back || Number.MAX_SAFE_INTEGER) - 1;
this.data[this.back] = value;
}
removeBack() {
if (!this.size) return;
let value = this.peekBack();
this.size--;
delete this.data[this.back];
this.back = (this.back + 1) % Number.MAX_SAFE_INTEGER;
return value;
}
peekBack() {
if (this.size) return this.data[this.back];
}
}

// demo
let deque = new Deque;
console.log(deque.peekFront()); // undefined
deque.addFront(1);
console.log(deque.peekBack()); // 1
deque.addFront(2);
console.log(deque.removeBack()); // 1
deque.addFront(3);
deque.addFront(4);
console.log(deque.peekBack()); // 2
deque.addBack(5);
deque.addBack(6);
console.log(deque.peekBack()); // 6
console.log(deque.removeFront()); // 4
console.log(deque.removeFront()); // 3
console.log(deque.removeFront()); // 2
console.log(deque.removeFront()); // 5
console.log(deque.removeFront()); // 6
console.log(deque.removeFront()); // undefined

当尝试从空双端队列中检索值时,方法将返回未定义

关于javascript - 如何在javascript中实现deque数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60052873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com