Construir un stack en JavaScript es más sencillo cuando entendemos cómo funcionan los nodos y los pointers. Aquí verás cómo definir la clase, crear nodos, validar el estado y programar los métodos peek y push para crecer la estructura paso a paso con seguridad.
¿Cómo construir un stack en JavaScript desde cero?
Para iniciar, se define la clase sin valores iniciales: no se obliga a pasar un primer elemento al crear la instancia. En el constructor se establecen tres propiedades clave: top y bottom en null, y length en 0. Así, el stack comienza vacío y se llena con push.
Instancia sin valor inicial: se crece con push, no en el constructor.
Propiedades base: top, bottom y length con valores controlados.
Estrategia: separar la definición del stack de la lógica de inserción.
¿Qué define el constructor y la instancia?
top: el elemento de arriba. Inicia en null.
bottom: el primer elemento en la base. Inicia en null.
length: la longitud del stack. Inicia en 0.
instancia: por ejemplo, const myStack = new Stack().
¿Por qué usar un node y next como en una linked list?
Cada elemento agregado se modela como un node con dos campos: value y next. Esto permite enlazar elementos como en una linked list y manipular el top con seguridad.
node.value: guarda el dato.
node.next: referencia al siguiente nodo. Inicia en null.
beneficio: facilita operaciones LIFO y manejo de referencias.
Estos métodos implementan el comportamiento LIFO del stack: el último que entra es el primero en salir. peek devuelve el elemento del top sin modificar la estructura. push agrega un nuevo nodo y lo coloca como top.
¿Cómo funciona peek para obtener el último elemento?
objetivo: devolver el elemento en el top.
parámetros: ninguno, no se selecciona un índice.
retorno: la referencia al top actual.
idea clave: no altera el stack, solo lo consulta.
¿Cómo se implementa push con validación y referencias?
crear new node: const newNode = new Node(value).
validación de vacío: si length === 0, top y bottom apuntan al mismo nodo.
guardar referencia: usar un holding pointer con el top actual.
actualizar longitud: incrementar length y retornar el stack.
prevención: evitar perder referencias para que el garbage collector no borre nodos.
¿Cómo probar el stack y qué sigue?
La verificación es directa: crear la instancia, hacer varios push y llamar a peek para confirmar que devuelve el último elemento agregado.
const myStack =newStack();myStack.push(1);// top y bottom son 1myStack.push(2);// top es 2, bottom sigue siendo 1myStack.push(3);// top es 3const last = myStack.peek();// devuelve el nodo con value 3
resultado esperado: tras insertar 1, 2 y 3, peek devuelve el 3.
invariante: bottom permanece en el primer valor insertado mientras no se elimine.
reto propuesto: implementar pop para eliminar el último elemento.
tip útil: dibujar la lógica en papel antes de codificar aclara el flujo de pointers.
¿Tienes tu versión de pop lista o una variante de validaciones que quieras mostrar? Compártela en comentarios y cuéntanos cómo lo resolviste.
Implementación de Stacks en JavaScript: Métodos Push y Peek
Implementación de Stacks en JavaScript: Métodos Push y Peek
Recursos
Resumen
Construir un stack en JavaScript es más sencillo cuando entendemos cómo funcionan los nodos y los pointers. Aquí verás cómo definir la clase, crear nodos, validar el estado y programar los métodos peek y push para crecer la estructura paso a paso con seguridad.
¿Cómo construir un stack en JavaScript desde cero?
Para iniciar, se define la clase sin valores iniciales: no se obliga a pasar un primer elemento al crear la instancia. En el constructor se establecen tres propiedades clave: top y bottom en null, y length en 0. Así, el stack comienza vacío y se llena con push.
Instancia sin valor inicial: se crece con push, no en el constructor.
Propiedades base: top, bottom y length con valores controlados.
Estrategia: separar la definición del stack de la lógica de inserción.
¿Qué define el constructor y la instancia?
top: el elemento de arriba. Inicia en null.
bottom: el primer elemento en la base. Inicia en null.
length: la longitud del stack. Inicia en 0.
instancia: por ejemplo, const myStack = new Stack().
¿Por qué usar un node y next como en una linked list?
Cada elemento agregado se modela como un node con dos campos: value y next. Esto permite enlazar elementos como en una linked list y manipular el top con seguridad.
node.value: guarda el dato.
node.next: referencia al siguiente nodo. Inicia en null.
beneficio: facilita operaciones LIFO y manejo de referencias.
Estos métodos implementan el comportamiento LIFO del stack: el último que entra es el primero en salir. peek devuelve el elemento del top sin modificar la estructura. push agrega un nuevo nodo y lo coloca como top.
¿Cómo funciona peek para obtener el último elemento?
objetivo: devolver el elemento en el top.
parámetros: ninguno, no se selecciona un índice.
retorno: la referencia al top actual.
idea clave: no altera el stack, solo lo consulta.
¿Cómo se implementa push con validación y referencias?
crear new node: const newNode = new Node(value).
validación de vacío: si length === 0, top y bottom apuntan al mismo nodo.
guardar referencia: usar un holding pointer con el top actual.
actualizar longitud: incrementar length y retornar el stack.
prevención: evitar perder referencias para que el garbage collector no borre nodos.
¿Cómo probar el stack y qué sigue?
La verificación es directa: crear la instancia, hacer varios push y llamar a peek para confirmar que devuelve el último elemento agregado.
const myStack = new Stack();
myStack.push(1); // top y bottom son 1
myStack.push(2); // top es 2, bottom sigue siendo 1
myStack.push(3); // top es 3
const last = myStack.peek(); // devuelve el nodo con value 3
resultado esperado: tras insertar 1, 2 y 3, peek devuelve el 3.
invariante: bottom permanece en el primer valor insertado mientras no se elimine.
reto propuesto: implementar pop para eliminar el último elemento.
tip útil: dibujar la lógica en papel antes de codificar aclara el flujo de pointers.
¿Tienes tu versión de pop lista o una variante de validaciones que quieras mostrar? Compártela en comentarios y cuéntanos cómo lo resolviste.
Quiero que notes como el método peek lo único que hace es tomar el último elemento, sin embargo, NO lo elimina, ¿Qué pasaría si escribieras peek dos veces?
myStack.peek()
myStack.peek()
Pues las dos veces te va a devolver el mismo valor porque el elemento top nunca fue eliminado. Por tanto, no tendrías forma de acceder a los otros elementos que están en el stack, es por eso que el método peek suele ir acompañado del método pop:
myStack.peek()
myStack.pop()
De esta forma tomas el primer elemento al top de la pila y a su vez lo eliminas del top ^^
Un pequeño aporte. Para entender las mecánicas lo he pensado en dos partes:
Los nodos: son los elementos que almacenan el Dato (value) y una referencia (pointer) a otro nodo. en el caso de un Stack LIFO, la referencia es al nodo anterior. (yo en lugar de llamarlo next lo llamaría prev creo que es más semántico decir que desde el top hay algo antes y no después).
El Stack: contiene los nodos, y la referencia del nodo inicial = bottom, el nodo final = top, y la longitud del stack.
luego de esto, para mi ha sido mas fácil saber quien es top, bottom, top.prev. en el stack y quien es value y prev en el nodo..