Comment mettre en place une Pile et une File d'attente en JavaScript?
Quelle est la meilleure façon de mettre en œuvre une Pile et une File d'attente en JavaScript?
Je suis à la recherche de faire de la shunting-yard algorithme et je vais avoir besoin de ces données-structures.
Vous devez vous connecter pour publier un commentaire.
prises de "9 javascript conseils, vous ne pouvez pas savoir"
ArrayList
); cela signifie que les transferts les plus susceptibles d'impliquer unmemmove()
; vous auriez à vérifier les sources de votre moteur JS de choix à faire bien sûr, mais...Javascript a push et pop méthodes qui fonctionnent sur ordinaire tableau Javascript les objets.
Pour les files d'attente, regardez ici:
http://safalra.com/web-design/javascript/queues/
Tableaux.
Pile:
File d'attente:
push
etpop
méthodes, alors le problème est résolu. Je ne vois vraiment pas votre point de vue ici.Si vous voulez faire vos propres structures de données, vous pouvez construire votre propre:
Et de file d'attente:
Node
s être supprimé lorsque popping/file d'attente ... n'est-ce pas tout simplement s'asseoir autour d'accaparer la mémoire jusqu'à ce que le navigateur se bloque?delete
mot-clé, mais qui n'est utile que pour marque d'une propriété d'un objet comme étant non-présent—ce qui est différent de l'organisation desundefined
à la propriété. JavaScript a aussi unnew
de l'opérateur, mais c'est juste utilisé pour définirthis
à un nouvel objet vide lors de l'appel d'une fonction. En C++, vous devez le coupler chaquenew
avec undelete
, mais pas en JavaScript car GC. Pour arrêter l'utilisation de la mémoire en JavaScript, juste arrêter faisant référence à l'objet et il finira par être remis en état.Ma mise en œuvre de Pile et File en utilisant Liste
JS:
Tableau Javascript shift() est lent, surtout au moment de la tenue de nombreux éléments. Je sais que les deux façons de mettre en œuvre la file d'attente avec amorti O(1) de la complexité.
Première est par l'utilisation de mémoire tampon circulaire et de la table de multiplication. J'ai mis en œuvre cette avant. Vous pouvez voir mon code source ici
https://github.com/kevyuu/rapid-queue
La deuxième façon est d'utiliser deux de la pile. Ceci est le code de la file d'attente avec deux pile
C'est la comparaison des performances à l'aide de jsPerf
CircularQueue.maj() vs Tableau.maj()
http://jsperf.com/rapidqueue-shift-vs-array-shift
Comme vous pouvez le voir, il est nettement plus rapide avec vaste ensemble de données
Il existe quelques façons dont vous pouvez mettre en œuvre les Piles et les Files d'attente en Javascript. La plupart des réponses ci-dessus sont assez peu profonde implémentations et je voudrais essayer de mettre en place quelque chose de plus lisible (à l'aide de la nouvelle syntaxe caractéristiques de l'es6) et robuste.
Voici la pile de mise en œuvre:
Et c'est comment vous pouvez utiliser la pile :
Si vous souhaitez voir la description détaillée à propos de cette mise en œuvre et comment il peut encore être amélioré, vous pouvez lire ici : http://jschap.com/data-structures-in-javascript-stack/
Voici le code pour la file d'attente de la mise en œuvre dans l'es6 :
Voici comment vous pouvez utiliser cette application:
De passer par le tutoriel complet de la façon dont ces structures de données ont été mises en œuvre et comment peuvent-ils encore être améliorée, vous pouvez aller à travers le "Jeu avec des structures de données en javascript' de la série à jschap.com . Voici les liens pour les files d'attente - http://jschap.com/playing-data-structures-javascript-queues/
Ou d'autre, vous pouvez utiliser deux tableaux pour mettre en œuvre la file d'attente de la structure de données.
Si je pop les éléments de maintenant, alors la sortie sera 3,2,1.
Mais nous voulons FIFO structure de sorte que vous pouvez effectuer les opérations suivantes.
push
la première fois que vouspop
Ici est assez simple file d'attente de mise en œuvre avec deux objectifs:
La pile de la mise en œuvre des actions du deuxième but seulement.
Vous pouvez utiliser votre propre personnaliser classe basée sur le concept, voici l'extrait de code que vous pouvez utiliser pour faire les choses
et de vérifier ce faire, utilisez votre console et essayer ces ligne un par un.
Si vous comprenez les piles avec la fonction push() et pop (), alors la file d'attente est juste pour faire un de ces opérations dans le sens oppos. Oppos de push() est unshift() et oppos de la pop() es shift().
Alors:
Voici la liste liée version de une file d'attente, qui comprend également le dernier nœud, comme suggéré par @perkins et comme dans la plupart des cas.
Pas d'Array(s)
La pile de la mise en œuvre est trivial comme expliqué dans les autres réponses.
Cependant, je n'ai pas trouvé de réponses satisfaisantes à ce fil de discussion pour la mise en œuvre d'une file d'attente en javascript, j'ai donc fait mon propre.
Il existe trois types de solutions dans ce fil:
array.shift()
sur un grand tableau est très inefficaceRetardé maj tableaux sont la solution la plus satisfaisante dans mon esprit, mais ils continuent à stocker le tout dans un grand contiguë tableau qui peut être problématique, et l'application va s'échelonner lorsque le tableau est coupé en tranches.
J'ai fait une mise en œuvre à l'aide d'une des listes liées de petits tableaux (les éléments de 1000 max chacun). Les tableaux se comportent comme des retardés maj tableaux, sauf qu'ils ne sont jamais tranché: lors de chaque élément du tableau est supprimé, l'ensemble est tout simplement ignorée.
Le paquet est sur ngp avec basic FIFO fonctionnalité, j'ai juste poussé récemment. Le code est divisé en deux parties.
Voici la première partie
Et voici le principal
Queue
classe:Annotations de Type (
: X
) peut facilement être enlevé pour obtenir ES6 code javascript.Régulières de la structure du Tableau en Javascript est une Pile (first in, last out) et peut également être utilisé comme une File d'attente (premier entré, premier sorti) selon les appels que vous effectuez.
Vérifier ce lien pour voir comment faire un Tableau d'agir comme une File d'attente:
Les files d'attente
Si vous êtes à la recherche pour ES6 de la programmation orientée objet la mise en œuvre de la Pile et File d'attente de la structure des données avec quelques opérations de base (basé sur les listes chaînées), alors il pourrait ressembler à ceci:
Queue.js
Stack.js
Et LinkedList de mise en œuvre qui est utilisé pour la Pile et File d'attente dans les exemples ci-dessus peuvent être trouvés sur GitHub ici.
Ce qui concerne,
En Javascript la mise en œuvre de piles et files d'attente est comme suit:
Pile: Une pile est un conteneur d'objets qui sont insérés et retirés selon le dernier entré, premier sorti (LIFO) principe.
File d'attente: Une file d'attente est un conteneur d'objets (un linéaire de la collection) qui sont insérés et retirés en fonction du premier entré, premier sorti (FIFO) principe.
Unshift: Méthode ajoute un ou plusieurs éléments au début d'un tableau.
Maj: Méthode supprime le premier élément d'un tableau.
JS:
Créer une paire de classes qui fournissent les différentes méthodes que chacune de ces structures de données a (push, pop, coup d'oeil, etc). Maintenant mettre en œuvre les méthodes. Si vous êtes familier avec les concepts de base de la pile/de la file d'attente, ce devrait être assez simple. Vous pouvez mettre en œuvre la pile avec un tableau, et une file d'attente avec une liste liée, bien qu'il existe certainement d'autres façons d'aller à ce sujet. Javascript va rendre cela facile, car il est faiblement typé, de sorte que vous n'avez même pas à vous soucier des types génériques, qui vous avez à faire si vous avez été mise en œuvre en Java ou en C#.
Voici ma mise en Œuvre de Piles.
Me semble que le construit dans le tableau est parfait pour une pile. Si vous voulez une File d'attente à la Machine ici est une mise en œuvre
Et voici une
Jest
test pour elleEspère que quelqu'un trouve cela utile,
Acclamations,
Stu
vous pouvez utiliser WeakMaps pour la mise en œuvre de la propriété privée dans l'ES6 classe et les avantages de la Chaîne de propriétés et de méthodes dans le langage JavaScript, comme ci-dessous: