如何在javascript中实现deque数据结构?
我正在用javascript学习数据结构 我现在的重点是如何实现deque Edite:从下面的评论中,我得到了关于如何实现基于deque的数组的有用指导。如何使用类实现基于对象的如何在javascript中实现deque数据结构?,javascript,data-structures,deque,Javascript,Data Structures,Deque,我正在用javascript学习数据结构 我现在的重点是如何实现deque Edite:从下面的评论中,我得到了关于如何实现基于deque的数组的有用指导。如何使用类实现基于对象的deque 我了解了一些我需要的要点: addFront() removeFront() () addBack() removeBack() 躲猫猫 但我对以下几点感到困惑: 我需要多少个指针? 至少我从队列中知道我需要两个(头尾)指针,但不确定我是否需要更多的指针 在本例中,javascript中的哪
deque
我了解了一些我需要的要点:
- addFront()
- removeFront()
- ()
- addBack()
- removeBack()
- 躲猫猫
但我对以下几点感到困惑:
- 我需要多少个指针? 至少我从队列中知道我需要两个(头尾)指针,但不确定我是否需要更多的指针
- 在本例中,javascript中的哪种数据类型可以作为基础?我在youtube上看到一些导师在谈论圆形数组,例如,我在JS中不知道的圆形数组
如果我错过了任何一点,我将非常感激告诉我。。。感谢如评论中所述,JavaScript通过其数组类/原型(push、pop、shift、unshift)对deque操作提供了本机支持 如果您仍然想编写自己的实现,那么您可以使用双链接列表,其中只需要两个“指针”。应该说,在JavaScript中,我们并没有真正谈论指针,而是对象。获取对象作为值的变量或属性实际上是JavaScript中的引用 或者,您可以选择圆形阵列。因为在JavaScript中,标准数组不能保证是连续的数组,例如C中的情况,所以实际上不需要使用数组实例。普通对象(或贴图)就可以了 因此,这里有两种可能的实现: 双链表
class-Deque{
构造函数(){
this.front=this.back=未定义;
}
addFront(值){
如果(!this.front)this.front=this.back={value};
else this.front=this.front.next={value,prev:this.front};
}
removeFront(){
让value=this.peekFront();
如果(this.front==this.back)this.front=this.back=未定义;
else(this.front=this.front.prev).next=undefined;
返回值;
}
peekFront(){
返回this.front&&this.front.value;
}
加回(值){
如果(!this.front)this.front=this.back={value};
else this.back=this.back.prev={value,next:this.back};
}
removeBack(){
让value=this.peek back();
如果(this.front==this.back)this.front=this.back=未定义;
else(this.back=this.back.next).back=未定义;
返回值;
}
peek back(){
返回this.back&&this.back.value;
}
}
//演示
设deque=新deque;
console.log(deque.peekFront());//未定义
德克·阿德弗罗斯特(1);
console.log(deque.peekBack());//1.
德克·阿德弗罗斯特(2);
console.log(deque.removeBack());//1.
德克·阿德弗罗斯特(3);
德克·阿德弗罗斯特(4);
console.log(deque.peekBack());//2.
deque.addBack(5);
德克。加回(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());//未定义的
以一种简单的方式将实现出列:
const dequeue = [];
// push element from rear end
dequeue.push(3); // [3]
dequeue.push(8); // [3, 8]
// push element from front end
dequeue.unshift(5); // [5, 3, 8]
dequeue.unshift(11); // [11, 5, 3, 8]
// pop element from rear end
dequeue.pop(); // [11, 5, 3]
// pop element from front end
dequeue.shift(); // [5, 3]
默认的JS数组已经是这样的结构:
push()
,pop()
,shift()
,unshift()
以及标准索引访问应该为您提供所需的所有工具。@Sirko您的意思是我不需要deque
,只需要default JS array
就可以了?@Sirko我明白default JS array
允许随机访问数据,而deque
不允许添加,仅从中间位置修改或删除end@AymanMorsy,如果这是您关心的问题,那么只需使可以在您的数组中使用的所有其他方法无效即可。JS数组支持您需要的所有方法。如果要抑制任何其他方法,则您需要一个包装器或类似的东西来限制访问(也可能是map()
,…)。我建议将delete
添加到remove方法中,这样就不会泄漏内存。@kaya3,好建议!在第二个代码段中添加了delete
。@trincot您非常接近。。。我在我的Q中做了一些编辑,你能看到吗?给我一个想法是第三种可能的实现,或者只是你的答案,需要一些改进或改变,以达到我上面看到的结果。。。非常感谢,谢谢你,特林科特。。。在@Bergi的帮助下获得第三个实现的源代码,我希望能帮助@AymanMorsy的任何人,你提到的那个实现真的很差劲。每当您执行addFront
且lowestCount
为零时,它将执行for
循环,以将所有项目移到一个位置。这真的扼杀了您期望从deque获得的性能提升。此外,JavaScript有一个unshift
方法,可以完成所有这些,但效率更高。高效的实现不需要循环。