Domina la implementación de un queue en JavaScript con una lógica clara y confiable. Aquí verás cómo manejar first, last y length, cómo enqueue agrega al final y cómo peek devuelve siempre el primer elemento. La clave está en enlazar nodos con next sin perder referencias, tal como en una linked list, y dejar lista la base para tu propio dequeue.
¿Qué es un queue y cómo se diferencia de stack?
Un queue es una estructura FIFO: el primer elemento en entrar es el primero en salir. A diferencia de un stack con top y bottom, aquí trabajamos con first y last. El método peek debe regresar siempre el elemento al frente, es decir, el first. Cuando se crea la instancia, comienza vacía y la vamos llenando con enqueue.
Clase y nodos: un Node con valor y puntero next.
Estado del queue: first, last y length para controlar la estructura.
Punteros: nunca dejes un nodo sin next si hay más elementos, para no perder referencias en memoria.
Prueba mental: al agregar 1, luego 2 y luego 3, first sigue en 1 y last avanza a 2 y luego a 3.
¿Cómo se implementa enqueue y peek en JavaScript?
La lógica de enqueue es agregar siempre al final. Si está vacío, el nuevo nodo es a la vez first y last. Si no, se enlaza con last.next y se actualiza last. El método peek retorna el first sin modificar la estructura.
¿Cómo luce la clase queue con first, last y length?
classNode{constructor(value){this.value= value;this.next=null;}}classQueue{constructor(){this.first=null;this.last=null;this.length=0;}peek(){returnthis.first;}enqueue(value){const newNode =newNode(value);if(this.length===0){this.first= newNode;this.last= newNode;}else{this.last.next= newNode;this.last= newNode;}this.length++;returnthis;// para visualizar el estado actual.}// dequeue(): pendiente, elimina el elemento al frente.}
Avance del final: last se actualiza al nuevo nodo.
¿Cómo probar y qué falta con dequeue?
Puedes replicar la prueba en consola: crear la instancia, agregar tres valores y consultar el frente con peek. Verás que el primero en entrar se mantiene al frente y last avanza con cada inserción.
Crear instancia: const queue = new Queue(); empieza vacía.
Agregar 1: queue.enqueue(1) el first y last son 1.
Agregar 2: queue.enqueue(2) el first sigue en 1, last pasa a 2.
Agregar 3: queue.enqueue(3) el last ahora es 3 y el encadenamiento es 1 → 2 → 3 por next.
Consultar frente: queue.peek() devuelve siempre el first.
Tu reto: implementar dequeue para “eliminar siempre el elemento que esté hasta adelante”, similar a un pop pero aplicado al frente del queue.
¿Te quedó alguna duda o quieres compartir tu implementación de dequeue o tu avance hacia tree? Cuéntame en comentarios y revisamos juntos.
FIFO
Existen muchos ejemplos de estructuras FIFO en la vida real, pero en el manejo de productos con fecha de vencimiento es particularmente usado.
En los supermercados es muy útil para el manejo de las verduras y refrigerados, ofreciendo los productos con fechas de vencimiento próxima en el frente del mostrador.
¿Por qué regresar toda la cola? Se supone que al desencolar, se debería regresar el primer elemento de la cola y quitarlo de la misma. A mi parecer, te falta esto:
El método dequeue sirve para remover el primer elemento de una cola y retornarlo, es muy similar al método pop de las pilas.
.
Y quiero que notes como con dequeue podemos retornar el primer elemento que fue añadido Y eliminarlo, contario a lo que haría peek que únicamente devolvería el primer elemento que fue añadido.
Como es que el elementi first fue cambiando , si este nunca se modifico en el codigo, es esto porque al preincipio se realizo un tipo de referencia y copia? Quisiera mas explicacion sobre esto, nunca vi un first.next en el codigo pero esta funcionando
Comprendo que la variable first fue cambiando porque tanto a first como last se les asigno el mismo objeto proveniente de la instancia new Node(value); entonces las variables quedan apuntando a la referencia del objeto newNode.
Estoy debugueando el código y tiene un comportamiento muy extraño, porque cuando pongo en la ++línea 25++ (de la imagen adjunta):
this.last.next=0;//Por ejemplo
Me cambia también el this.++first++.next, no le encuentro el sentido a esto. Estoy indicando que SOLO UNO (this.++last++.next) debe cambiar pero me cambian los dos, tanto this.first.next como this.last.next.
Agradezco alguien que entienda a que se debe este comportamiento tan poco intuitivo (creo que tiene algo que ver con el lugar en memoria que ocupa, pero realmente no lo se)
Hola Jose Daniel, para que puedas entender lo que sucede debes tener muy claro como funciona JavaScript cuando estamos modificando o compartiendo datos que son de tipo Objeto o Arreglo; para estos casos lo que el motor hace es compartir una referencia al objeto original, por ende cuando modificas this.last.next = 0 también se modifica el first, dado que la primera vez que son asignados están haciendo referencia al mismo objeto.
Si quieres aprender un poco mas, puedes revisar este articulo:
Back to roots: JavaScript Value vs Reference
Compañero en el dequeue debes realizar validaciones de cuando this.lenght es igual a 0 y cuando es igual a 1, revisa en tu codigo que pasa cuando aplicas esas dos opciones en tu código.
dequeue() {
if (this.length) {
const value = this.first;
this.first = value.next;
if (!this.first) {
this.last = null;
}
this.length--;
return value;
}
throw new Error('No existen más elementos en la cola');
}
cuando usamos esta clase de exprecion "this.last.next" estamos creando un nuevo metodo o es como guardar en unca constante ese valor para que no se eliminado? otiene que ver con los "this.last = null;" y this.next = null; que ya habiamos creado anteriormente? agradezco que me saquen de la duda gracias.
Reto Cumplido
dequeue(){//Eliminar el primer elementoif(this.length===0){const msg ='No hay elemento en su Queue';return msg;}elseif(this.length===1){this.first=null;this.last=null;}else{this.first=this.first.next;}this.length--;returnthis;}
Mi reto cumplido, gracias por enseñarnos.
dequeue(){if(this.length===0){return'Se borró el primer elemento del queue';}elseif(this.length===1){this.first=null;this.last=null;}else{this.first=this.first.next;}this.length--;returnthis;}
👾 Construyendo un Queue en Dart.
classNode{var value;var next;Node(this.value);}classQueue{var first;var last; int length =0;dynamicpeek()=> first;dynamicenqueue(var value){final newNode =Node(value);if(length ==0){ first = newNode; last = newNode;}else{ last.next = newNode; last = newNode;} length++;returnthis;}dynamicdequeue(){if(length ==0){return'Error: Queue empty.';}elseif(length ==1){ first =null; last =null;}else{ first = first.next;} length--;returnthis;}}
dequeue() {
if (this.length === 0) {
return 'no hay elementos en el Queue';
}
if (this.length === 1) {
this.first = null;
this.last = null;
this.length = 0;
}
let axiliar =this.first.next;this.first= axiliar; length--;returnthis;}