Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中实现deque数据结构?_Javascript_Data Structures_Deque - Fatal编程技术网

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

如何在javascript中实现deque数据结构?,javascript,data-structures,deque,Javascript,Data Structures,Deque,我正在用javascript学习数据结构 我现在的重点是如何实现deque Edite:从下面的评论中,我得到了关于如何实现基于deque的数组的有用指导。如何使用类实现基于对象的deque 我了解了一些我需要的要点: addFront() removeFront() () addBack() removeBack() 躲猫猫 但我对以下几点感到困惑: 我需要多少个指针? 至少我从队列中知道我需要两个(头尾)指针,但不确定我是否需要更多的指针 在本例中,javascript中的哪

我正在用javascript学习数据结构

我现在的重点是如何实现deque

Edite:从下面的评论中,我得到了关于如何实现基于deque的数组的有用指导。如何使用类实现基于对象的
deque

我了解了一些我需要的要点:

  • addFront()
  • removeFront()
  • ()

  • addBack()
  • removeBack()
  • 躲猫猫

但我对以下几点感到困惑:

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

  • 在本例中,javascript中的哪种数据类型可以作为基础?我在youtube上看到一些导师在谈论圆形数组,例如,我在JS中不知道的圆形数组

edite2:

我在读一本书,名叫:学习javascript数据结构和算法第三版

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

但我不明白他是怎么做到的,因为代码是加密的,但我仍然可以从中找到他的文件并测试他的方法

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

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

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


如果我错过了任何一点,我将非常感激告诉我。。。感谢

如评论中所述,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
方法,可以完成所有这些,但效率更高。高效的实现不需要循环。