Was ist der beste Weg, um einen Stapel und eine Warteschlange in JavaScript zu implementieren?
Ich möchte den Shunt-Yard-Algorithmus ausführen und benötige diese Datenstrukturen.
javascript
data-structures
stack
queue
KingNestor
quelle
quelle
Javascript verfügt über Push- und Pop-Methoden, die mit normalen Javascript-Array-Objekten arbeiten.
Warteschlangen finden Sie hier:
http://safalra.com/web-design/javascript/queues/
quelle
Arrays.
Stapel:
Warteschlange:
quelle
push
undpop
Methoden implementieren , ist das Problem behoben. Ich verstehe Ihren Standpunkt hier nicht wirklich.Wenn Sie Ihre eigenen Datenstrukturen erstellen möchten, können Sie Ihre eigenen erstellen:
Und für die Warteschlange:
quelle
Node
s beim Poppen / Dequeuing gelöscht werden. Sitzen sie nicht einfach herum, um den Speicher zu belasten, bis der Browser abstürzt?delete
Schlüsselwort, aber das ist nur nützlich, um eine Eigenschaft eines Objekts als nicht vorhandenundefined
zu markieren - was sich von der Zuweisung nur zu der Eigenschaft unterscheidet . JavaScript hat auch einennew
Operator, der jedoch nur verwendet wird, umthis
beim Aufrufen einer Funktion ein neues leeres Objekt festzulegen. In C ++ müssen Sie allenew
mit einemdelete
koppeln, aber nicht in JavaScript, weil GC. Um die Verwendung von Speicher in JavaScript zu beenden, hören Sie einfach auf, auf das Objekt zu verweisen, und es wird schließlich zurückgefordert.Meine Implementierung Stackund QueueVerwendungLinked List
quelle
Javascript Array Shift () ist langsam, insbesondere wenn viele Elemente enthalten sind. Ich kenne zwei Möglichkeiten, um eine Warteschlange mit amortisierter O (1) -Komplexität zu implementieren.
Erstens wird ein Kreispuffer und eine Tabellenverdopplung verwendet. Ich habe dies schon einmal implementiert. Sie können meinen Quellcode hier https://github.com/kevyuu/rapid-queue sehen
Der zweite Weg ist die Verwendung von zwei Stapeln. Dies ist der Code für eine Warteschlange mit zwei Stapeln
Dies ist ein Leistungsvergleich mit jsPerf
CircularQueue.shift () vs Array.shift ()
http://jsperf.com/rapidqueue-shift-vs-array-shift
Wie Sie sehen, ist es bei großen Datenmengen erheblich schneller
quelle
Es gibt einige Möglichkeiten, wie Sie Stapel und Warteschlangen in Javascript implementieren können. Die meisten der obigen Antworten sind recht flache Implementierungen, und ich würde versuchen, etwas Lesbareres (unter Verwendung der neuen Syntaxfunktionen von es6) und Robusteres zu implementieren.
Hier ist die Stack-Implementierung:
Und so können Sie den Stack verwenden:
Wenn Sie die detaillierte Beschreibung dieser Implementierung sehen möchten und wissen möchten, wie sie weiter verbessert werden kann, lesen Sie hier: http://jschap.com/data-structures-in-javascript-stack/
Hier ist der Code für die Implementierung der Warteschlange in es6:
So können Sie diese Implementierung verwenden:
Um das vollständige Tutorial zu lesen, wie diese Datenstrukturen implementiert wurden und wie diese weiter verbessert werden können, sollten Sie die Reihe "Spielen mit Datenstrukturen in Javascript" auf jschap.com durchgehen. Hier sind die Links für Warteschlangen - http://jschap.com/playing-data-structures-javascript-queues/
quelle
Sie können Ihre eigene Anpassungsklasse verwenden, die auf dem Konzept basiert, hier das Code-Snippet, mit dem Sie die Dinge erledigen können
und um dies zu überprüfen, verwenden Sie Ihre Konsole und versuchen Sie diese Zeile nacheinander.
quelle
quelle
Sie können auch zwei Arrays verwenden, um die Warteschlangendatenstruktur zu implementieren.
Wenn ich die Elemente jetzt platziere, ist die Ausgabe 3,2,1. Wir möchten jedoch eine FIFO-Struktur, damit Sie Folgendes tun können.
quelle
push
nach dem ersten Mal Siepop
Hier ist eine ziemlich einfache Implementierung der Warteschlange mit zwei Zielen:
Die Stack-Implementierung teilt nur das zweite Ziel.
quelle
Die Stapelimplementierung ist trivial, wie in den anderen Antworten erläutert.
Allerdings habe ich in diesem Thread keine zufriedenstellenden Antworten für die Implementierung einer Warteschlange in Javascript gefunden, daher habe ich meine eigenen erstellt.
In diesem Thread gibt es drei Arten von Lösungen:
array.shift()
für ein großes Array ist sehr ineffizient.Arrays mit verzögerter Verschiebung sind für mich die zufriedenstellendste Lösung, aber sie speichern immer noch alles in einem großen zusammenhängenden Array, was problematisch sein kann, und die Anwendung wird versetzt, wenn das Array in Scheiben geschnitten wird.
Ich habe eine Implementierung mit verknüpften Listen kleiner Arrays (jeweils maximal 1000 Elemente) durchgeführt. Die Arrays verhalten sich wie Arrays mit verzögerter Verschiebung, außer dass sie niemals in Scheiben geschnitten werden: Wenn jedes Element im Array entfernt wird, wird das Array einfach verworfen.
Das Paket ist auf npm mit grundlegenden FIFO-Funktionen, ich habe es erst kürzlich gepusht. Der Code ist in zwei Teile geteilt.
Hier ist der erste Teil
Und hier ist die Hauptklasse
Queue
:Typanmerkungen (
: X
) können leicht entfernt werden, um ES6-Javascript-Code zu erhalten.quelle
Wenn Sie Stapel mit den Funktionen push () und pop () verstehen, dient die Warteschlange nur dazu, eine dieser Operationen im entgegengesetzten Sinne durchzuführen. Das Gegenteil von push () ist unshift () und das Gegenteil von pop () ist shift (). Dann:
quelle
.shift()
Methode ist keine ordnungsgemäße Warteschlangenimplementierung. Es ist eher O (n) als O (1) und ist bei großen Warteschlangen langsam.Hier ist die verknüpfte Listenversion einer Warteschlange, die auch den letzten Knoten enthält, wie von @perkins vorgeschlagen und am besten geeignet.
quelle
Wenn Sie nach einer ES6 OOP-Implementierung der Stack- und Queue-Datenstruktur mit einigen grundlegenden Vorgängen (basierend auf verknüpften Listen) suchen, sieht dies möglicherweise folgendermaßen aus:
Queue.js
Stack.js
Die LinkedList-Implementierung, die in den obigen Beispielen für Stack und Queue verwendet wird, finden Sie hier auf GitHub .
quelle
Keine Arrays
quelle
Die reguläre Array-Struktur in Javascript ist ein Stapel (first in, last out) und kann je nach den von Ihnen getätigten Aufrufen auch als Warteschlange (first in, first out) verwendet werden.
Überprüfen Sie diesen Link, um zu sehen, wie sich ein Array wie eine Warteschlange verhält:
Warteschlangen
quelle
Grüße,
In Javascript werden Stapel und Warteschlangen wie folgt implementiert:
Stapel: Ein Stapel ist ein Container mit Objekten, die nach dem LIFO-Prinzip (Last-In-First-Out) eingefügt und entfernt werden.
Warteschlange: Eine Warteschlange ist ein Container mit Objekten (eine lineare Sammlung), die nach dem FIFO-Prinzip (First-In-First-Out) eingefügt und entfernt werden.
Unshift: Die Methode fügt ein oder mehrere Elemente am Anfang eines Arrays hinzu.
Shift: Die Methode entfernt das erste Element aus einem Array.
quelle
quelle
Mir scheint, dass das eingebaute Array für einen Stack in Ordnung ist. Wenn Sie eine Warteschlange in TypeScript möchten, finden Sie hier eine Implementierung
Und hier ist ein
Jest
Test dafürHoffe, jemand findet das nützlich,
Prost,
Stu
quelle
Erstellen Sie ein Klassenpaar, das die verschiedenen Methoden für jede dieser Datenstrukturen bereitstellt (Push, Pop, Peek usw.). Implementieren Sie nun die Methoden. Wenn Sie mit den Konzepten hinter Stack / Queue vertraut sind, sollte dies ziemlich einfach sein. Sie können den Stapel mit einem Array und eine Warteschlange mit einer verknüpften Liste implementieren, obwohl es sicherlich andere Möglichkeiten gibt, dies zu tun. Javascript macht dies einfach, da es schwach typisiert ist, sodass Sie sich nicht einmal um generische Typen kümmern müssen, was Sie tun müssten, wenn Sie es in Java oder C # implementieren würden.
quelle
Hier ist meine Implementierung von Stacks.
quelle
Sie können WeakMaps zum Implementieren von Privateigentum in der ES6-Klasse und für die Vorteile von String-Eigenschaften und -Methoden in der folgenden JavaScript-Sprache verwenden:
quelle
Erstellen Sie eine Warteschlange mit zwei Stapeln.
quelle