¿Cuál es la mejor manera de implementar una pila y una cola en JavaScript?
Estoy buscando hacer el algoritmo del patio de maniobras y voy a necesitar estas estructuras de datos.
javascript
data-structures
stack
queue
ReyNestor
fuente
fuente
Javascript tiene métodos push y pop, que operan en objetos de matriz Javascript comunes.
Para colas, mira aquí:
http://safalra.com/web-design/javascript/queues/
fuente
Arreglos
Apilar:
Cola:
fuente
push
ypop
, entonces el problema está resuelto. Realmente no veo tu punto aquí.Si quisiera crear sus propias estructuras de datos, podría crear las suyas propias:
Y para hacer cola:
fuente
Node
se eliminen las creaciones cuando aparecen / desaparecen ... ¿no se quedarán sentadas acumulando memoria hasta que el navegador se bloquee?delete
palabra clave, pero eso solo es útil para marcar una propiedad de un objeto como no presente, que es diferente de simplemente asignarlaundefined
a la propiedad . JavaScript también tiene unnew
operador, pero solo se usa para establecerthis
un nuevo objeto vacío cuando se llama a una función. En C ++ necesita emparejar cada unonew
con adelete
, pero no en JavaScript porque GC. Para dejar de usar memoria en JavaScript, simplemente deje de hacer referencia al objeto y eventualmente será reclamado.Mi implementación Stacky QueueusoLinked List
fuente
Javascript array shift () es lento, especialmente cuando se tienen muchos elementos. Conozco dos formas de implementar la cola con complejidad O (1) amortizada.
Primero es mediante el uso de búfer circular y duplicación de tabla. He implementado esto antes. Puedes ver mi código fuente aquí https://github.com/kevyuu/rapid-queue
La segunda forma es mediante el uso de dos pilas. Este es el código para la cola con dos pilas
Esta es la comparación de rendimiento usando jsPerf
CircularQueue.shift () vs Array.shift ()
http://jsperf.com/rapidqueue-shift-vs-array-shift
Como puede ver, es significativamente más rápido con un gran conjunto de datos
fuente
Hay bastantes maneras en que puede implementar pilas y colas en Javascript. La mayoría de las respuestas anteriores son implementaciones bastante superficiales y trataría de implementar algo más legible (usando nuevas características de sintaxis de es6) y robusto.
Aquí está la implementación de la pila:
Y así es como puedes usar la pila:
Si desea ver la descripción detallada sobre esta implementación y cómo se puede mejorar aún más, puede leer aquí: http://jschap.com/data-structures-in-javascript-stack/
Aquí está el código para la implementación de la cola en es6:
Aquí le mostramos cómo puede usar esta implementación:
Para ver el tutorial completo de cómo se han implementado estas estructuras de datos y cómo se pueden mejorar aún más, puede consultar la serie 'Jugar con estructuras de datos en javascript' en jschap.com. Aquí están los enlaces para colas: http://jschap.com/playing-data-structures-javascript-queues/
fuente
Puede usar su propia clase de personalización basada en el concepto, aquí el fragmento de código que puede usar para hacer las cosas
y para verificar esto use su consola y pruebe estas líneas una por una.
fuente
fuente
O bien, puede usar dos matrices para implementar la estructura de datos de la cola.
Si hago estallar los elementos ahora, la salida será 3,2,1. Pero queremos una estructura FIFO para que pueda hacer lo siguiente.
fuente
push
después de la primera vez quepop
Aquí hay una implementación de cola bastante simple con dos objetivos:
La implementación de la pila comparte solo el segundo objetivo.
fuente
La implementación de la pila es trivial como se explica en las otras respuestas.
Sin embargo, no encontré ninguna respuesta satisfactoria en este hilo para implementar una cola en javascript, así que hice la mía.
Hay tres tipos de soluciones en este hilo:
array.shift()
una matriz grande es muy ineficiente.En mi opinión, las matrices de turnos diferidos son la solución más satisfactoria, pero aún almacenan todo en una matriz contigua grande que puede ser problemática, y la aplicación se tambaleará cuando la matriz se corte.
Hice una implementación usando listas vinculadas de pequeñas matrices (1000 elementos como máximo cada una). Las matrices se comportan como matrices de desplazamiento retardado, excepto que nunca se cortan: cuando se eliminan todos los elementos de la matriz, la matriz simplemente se descarta.
El paquete está en npm con la funcionalidad básica FIFO, lo acabo de recientemente. El código se divide en dos partes.
Aqui esta la primera parte
Y aquí está la
Queue
clase principal :Las anotaciones de tipo (
: X
) se pueden eliminar fácilmente para obtener el código JavaScript ES6.fuente
Si comprende las pilas con las funciones push () y pop (), entonces la cola es solo para realizar una de estas operaciones en sentido contrario. El lado opuesto de push () es unshift () y opuesto a pop () es shift (). Entonces:
fuente
.shift()
método no es una implementación de cola adecuada. Es O (n) en lugar de O (1), y será lento para colas grandes.Aquí está la versión de la lista vinculada de una cola que también incluye el último nodo, según lo sugerido por @perkins y lo más apropiado.
fuente
Si está buscando la implementación ESOP OOP de la estructura de datos Stack and Queue con algunas operaciones básicas (basadas en listas vinculadas), entonces puede verse así:
Queue.js
Stack.js
Y la implementación de LinkedList que se usa para Stack y Queue en los ejemplos anteriores se puede encontrar en GitHub aquí .
fuente
Sin matriz (s)
fuente
La estructura de matriz regular en Javascript es una pila (primero en entrar, último en salir) y también se puede usar como una cola (primero en entrar, primero en salir) dependiendo de las llamadas que realice.
Consulte este enlace para ver cómo hacer que una matriz actúe como una cola:
Colas
fuente
Saludos,
En Javascript, la implementación de pilas y colas es la siguiente:
Pila: una pila es un contenedor de objetos que se insertan y eliminan de acuerdo con el principio de último en entrar, primero en salir (LIFO).
Cola: Una cola es un contenedor de objetos (una colección lineal) que se insertan y eliminan de acuerdo con el principio de primero en entrar, primero en salir (FIFO).
Unshift: Method agrega uno o más elementos al comienzo de una matriz.
Shift: el método elimina el primer elemento de una matriz.
fuente
fuente
Me parece que la matriz integrada está bien para una pila. Si desea una cola en TypeScript aquí hay una implementación
Y aquí hay una
Jest
prueba para elloEspero que alguien encuentre esto útil,
Salud,
Stu
fuente
Cree un par de clases que proporcionen los diversos métodos que tiene cada una de estas estructuras de datos (push, pop, peek, etc.). Ahora implemente los métodos. Si está familiarizado con los conceptos detrás de stack / queue, esto debería ser bastante sencillo. Puede implementar la pila con una matriz y una cola con una lista vinculada, aunque ciertamente hay otras formas de hacerlo. Javascript facilitará esto, porque está tipado débilmente, por lo que ni siquiera tiene que preocuparse por los tipos genéricos, lo que tendría que hacer si lo implementara en Java o C #.
fuente
Aquí está mi implementación de pilas.
fuente
puede usar WeakMaps para implementar propiedad privada en la clase ES6 y los beneficios de las propiedades y métodos de String en el lenguaje JavaScript como se muestra a continuación:
fuente
Construya una cola usando dos pilas.
fuente