Quelle est la meilleure façon d'implémenter une pile et une file d'attente en JavaScript?
Je cherche à faire l'algorithme de triage et je vais avoir besoin de ces structures de données.
javascript
data-structures
stack
queue
KingNestor
la source
la source
Javascript a des méthodes push et pop, qui fonctionnent sur des objets de tableau Javascript ordinaires.
Pour les files d'attente, regardez ici:
http://safalra.com/web-design/javascript/queues/
la source
Tableaux.
Empiler:
Queue:
la source
push
etpop
, le problème est résolu. Je ne vois pas vraiment votre point ici.Si vous vouliez créer vos propres structures de données, vous pourriez construire les vôtres:
Et pour la file d'attente:
la source
Node
s créés supprimés lors du popping / dequeuing ... ne resteront-ils pas juste à monopoliser la mémoire jusqu'à ce que le navigateur plante?delete
mot - clé, mais cela n'est utile que pour marquer une propriété d'un objet comme étant non présente, ce qui est différent de simplement assignerundefined
à la propriété . JavaScript a également unnew
opérateur, mais qui est juste utilisé pour définirthis
un nouvel objet vide lors de l'appel d'une fonction. En C ++, vous devez associer chaquenew
avec undelete
, mais pas en JavaScript car GC. Pour arrêter d'utiliser la mémoire en JavaScript, arrêtez simplement de référencer l'objet et il sera finalement récupéré.Mon implémentation Stacket QueueutilisationLinked List
la source
Le décalage de tableau Javascript () est lent, surtout lorsqu'il contient de nombreux éléments. Je connais deux façons d'implémenter la file d'attente avec une complexité O (1) amortie.
La première consiste à utiliser un tampon circulaire et un doublage de table. J'ai déjà implémenté cela. Vous pouvez voir mon code source ici https://github.com/kevyuu/rapid-queue
La deuxième façon consiste à utiliser deux piles. Ceci est le code pour la file d'attente avec deux piles
Ceci est une comparaison des performances à l'aide de jsPerf
CircularQueue.shift () vs Array.shift ()
http://jsperf.com/rapidqueue-shift-vs-array-shift
Comme vous pouvez le voir, c'est beaucoup plus rapide avec un grand ensemble de données
la source
Il existe plusieurs façons d'implémenter des piles et des files d'attente en Javascript. La plupart des réponses ci-dessus sont des implémentations assez superficielles et j'essaierais d'implémenter quelque chose de plus lisible (en utilisant les nouvelles fonctionnalités de syntaxe d'es6) et robuste.
Voici l'implémentation de la pile:
Et voici comment vous pouvez utiliser la pile:
Si vous souhaitez voir la description détaillée de cette implémentation et comment elle peut être encore améliorée, vous pouvez lire ici: http://jschap.com/data-structures-in-javascript-stack/
Voici le code pour l'implémentation de la file d'attente dans es6:
Voici comment vous pouvez utiliser cette implémentation:
Pour parcourir le didacticiel complet sur la façon dont ces structures de données ont été mises en œuvre et comment les améliorer, vous pouvez consulter la série «Jouer avec les structures de données en javascript» sur jschap.com. Voici les liens pour les files d'attente - http://jschap.com/playing-data-structures-javascript-queues/
la source
Vous pouvez utiliser votre propre classe de personnalisation basée sur le concept, ici l'extrait de code que vous pouvez utiliser pour faire les choses
et pour vérifier cela, utilisez votre console et essayez ces lignes une par une.
la source
la source
Sinon, vous pouvez utiliser deux tableaux pour implémenter la structure des données de file d'attente.
Si je pop les éléments maintenant, la sortie sera 3,2,1. Mais nous voulons une structure FIFO afin que vous puissiez faire ce qui suit.
la source
push
après la première fois que vouspop
Voici une implémentation de file d'attente assez simple avec deux objectifs:
L'implémentation de la pile partage le deuxième objectif uniquement.
la source
L'implémentation de la pile est triviale comme expliqué dans les autres réponses.
Cependant, je n'ai trouvé aucune réponse satisfaisante dans ce fil pour implémenter une file d'attente en javascript, j'ai donc fait la mienne.
Il existe trois types de solutions dans ce fil:
array.shift()
sur un grand tableau est très inefficace.Les tableaux à décalage retardé sont la solution la plus satisfaisante dans mon esprit, mais ils stockent toujours tout dans un grand tableau contigu qui peut être problématique, et l'application va échouer lorsque le tableau est découpé.
J'ai fait une implémentation en utilisant des listes chaînées de petits tableaux (1000 éléments max chacun). Les tableaux se comportent comme des tableaux à décalage retardé, sauf qu'ils ne sont jamais tranchés: lorsque chaque élément du tableau est supprimé, le tableau est simplement supprimé.
Le forfait est sur npm avec des fonctionnalités FIFO de base, je viens de le pousser récemment. Le code est divisé en deux parties.
Voici la première partie
Et voici la
Queue
classe principale :Les annotations de type (
: X
) peuvent facilement être supprimées pour obtenir le code javascript ES6.la source
Si vous comprenez les piles avec les fonctions push () et pop (), alors la file d'attente consiste simplement à effectuer l'une de ces opérations dans le sens opposé. L'opposé de push () est unshift () et l'opposé de pop () es shift (). Alors:
la source
.shift()
méthode n'est pas une implémentation de file d'attente appropriée. Il s'agit de O (n) plutôt que de O (1) et sera lent pour les grandes files d'attente.Voici la version de liste liée d'une file d'attente qui inclut également le dernier nœud, comme suggéré par @perkins et comme il est le plus approprié.
la source
Si vous recherchez une implémentation ES6 OOP de la structure de données Stack and Queue avec quelques opérations de base (basées sur des listes liées), cela peut ressembler à ceci:
Queue.js
Stack.js
Et l'implémentation LinkedList qui est utilisée pour Stack et Queue dans les exemples ci-dessus peut être trouvée sur GitHub ici .
la source
Pas de tableau (s)
la source
La structure régulière de tableau en Javascript est une pile (premier entré, dernier sorti) et peut également être utilisée comme file d'attente (premier entré, premier sorti) en fonction des appels que vous effectuez.
Consultez ce lien pour voir comment faire en sorte qu'un tableau agisse comme une file d'attente:
Files d'attente
la source
Cordialement,
En Javascript, l'implémentation des piles et des files d'attente est la suivante:
Pile: Une pile est un conteneur d'objets qui sont insérés et retirés selon le principe du dernier entré, premier sorti (LIFO).
File d'attente: une file d'attente est un conteneur d'objets (une collection linéaire) qui sont insérés et retirés selon le principe du premier entré, premier sorti (FIFO).
Unshift: la méthode ajoute un ou plusieurs éléments au début d'un tableau.
Maj: la méthode supprime le premier élément d'un tableau.
la source
la source
Il me semble que le tableau intégré convient à une pile. Si vous voulez une file d'attente en TypeScript, voici une implémentation
Et voici un
Jest
test pour çaJ'espère que quelqu'un trouve cela utile,
À votre santé,
Stu
la source
Créez une paire de classes qui fournissent les différentes méthodes de chacune de ces structures de données (push, pop, peek, etc.). Maintenant, implémentez les méthodes. Si vous connaissez les concepts de pile / file d'attente, cela devrait être assez simple. Vous pouvez implémenter la pile avec un tableau et une file d'attente avec une liste liée, bien qu'il existe certainement d'autres façons de procéder. Javascript vous facilitera la tâche, car il est faiblement typé, vous n'avez donc même pas à vous soucier des types génériques, ce que vous auriez à faire si vous l'implémentiez en Java ou en C #.
la source
Voici mon implémentation de piles.
la source
vous pouvez utiliser WeakMaps pour implémenter la propriété privée dans la classe ES6 et les avantages des propriétés et méthodes String en langage JavaScript comme ci-dessous:
la source
Construisez une file d'attente à l'aide de deux piles.
la source