¿Una pila es una estructura de datos lineal simple que funciona como una pila de platos?️. Sigue el principio de último en entrar, primero en salir (LIFO). Piense en ello como una pila de platos: solo puede agregar o quitar platos de la parte superior de la pila.
Para comprender mejor la pila, ¿emprendemos un breve viaje de imaginación?.
Imagina que estás en un restaurante elegante ?️ y el personal de la cocina se está preparando para una noche ajetreada ??. En el área de los platos, hay una gran pila de platos esperando a ser utilizados. A medida que llegan los comensales y llegan los pedidos, el personal toma los platos de la parte superior de la pila. Cuando se agregan platos limpios, van directamente encima. Este sencillo sistema garantiza que los platos en la parte inferior de la pila que han estado allí por más tiempo se usen al final, mientras que los platos recién limpios en la parte superior se usan primero ✨.
Así es, en esencia, cómo funciona una estructura de datos Stack. Una pila es una estructura de datos lineal que sigue el principio de último en entrar, primero en salir (LIFO). Al igual que con nuestra pila de platos, el último elemento agregado a una pila es el primero en eliminarse.
En este tutorial completo sobre la estructura de datos de la pila, exploraremos los siguientes temas con un enfoque sencillo y apto para principiantes:
¿Estás listo? Vamos a sumergirnos
Una pila es una estructura de datos lineal que sigue el principio de último en entrar, primero en salir (LIFO). Esto significa que el último elemento agregado a la pila será el primero en eliminarse. Piense en ello como una pila de libros: solo puede agregar o quitar libros desde la parte superior de la pila.
Antes de continuar con el flujo y escribir algunos códigos, es excelente comprender dónde y dónde no usar Stack. La siguiente tabla proporciona detalles explícitos de los pros y los contras de Stack.
Pros | Contras |
---|---|
Simple y fácil de implementar | Acceso limitado (solo se puede acceder directamente al elemento superior) |
Eficiente para operaciones de último en entrar, primero en salir (LIFO) | No apto para acceso aleatorio a elementos |
Tiempo constante O(1) para operaciones push y pop | Puede provocar un desbordamiento de la pila si no se gestiona correctamente |
Útil para rastrear el estado en algoritmos (por ejemplo, búsqueda en profundidad) | No es ideal para buscar o acceder a elementos arbitrarios |
Ayuda en la gestión de la memoria (por ejemplo, pila de llamadas en lenguajes de programación) | Tamaño fijo en algunas implementaciones (pilas basadas en matrices) |
Útil para revertir datos | Puede ser necesario cambiar el tamaño en implementaciones dinámicas, lo que puede resultar costoso |
Admite algoritmos recursivos de forma natural | No es eficiente para grandes conjuntos de datos que requieren un recorrido frecuente |
Ayuda en la evaluación de expresiones y el análisis de sintaxis | Posible desbordamiento insuficiente si se llama a la operación pop en una pila vacía |
Útil en mecanismos de deshacer en software | Funcionalidad limitada en comparación con estructuras de datos más complejas |
Eficiente para ciertos tipos de organización de datos (por ejemplo, historial del navegador) | No apto para problemas que requieren un comportamiento similar a una cola (FIFO) |
Las operaciones fundamentales que se pueden realizar en una pila son:
Las pilas están en todas partes en la informática y el desarrollo de software. Estas son algunas aplicaciones comunes:
Funcionalidad Deshacer: en editores de texto o software de diseño gráfico, cada acción se coloca en una pila. Cuando presionas "deshacer", la acción más reciente se elimina de la pila y se invierte.
Historial del navegador: cuando visitas una página nueva, se coloca en una pila. El botón "atrás" saca la página actual de la pila y revela la anterior.
Pila de llamadas a funciones: en los lenguajes de programación, las llamadas a funciones se gestionan mediante una pila. Cuando se llama a una función, se coloca en la pila de llamadas. Cuando regresa, se desprende.
Evaluación de expresiones: Las pilas se utilizan para evaluar expresiones aritméticas, especialmente aquellas en notación posfija.
Algoritmos de retroceso: en problemas como la resolución de laberintos o acertijos, las pilas pueden realizar un seguimiento del camino tomado, lo que permite retroceder fácilmente cuando sea necesario.
Ahora, implementemos una pila en JavaScript. Es importante saber que existen diferentes formas de implementar una pila en JavaScript. Una de las formas comunes de implementar una pila es usar una matriz, otra forma es usar una lista vinculada. En este artículo, implementaremos una pila usando una lista vinculada (lista vinculada individualmente).
Espero que todavía recuerdes cómo funciona la lista enlazada. Es posible que necesites consultar la implementación de la lista vinculada en uno de nuestros artículos anteriores de esta misma serie.
Ahora, comencemos a implementar nuestra pila usando una lista enlazada individualmente. ¿Debemos?
Primero, crearemos una clase de Nodo para representar el elemento individual de nuestra pila.
class Node { constructor(data) { this.data = data; this.next = null; } }
Luego, crearemos una clase Stack para representar nuestra pila.
class Stack { constructor() { this.top = null; this.size = 0; } // Stack Operations will be implemented here ? }
La operación de inserción agrega un nuevo elemento a la parte superior de la pila. Crea un nuevo StackNode, establece su siguiente puntero en la parte superior actual y luego actualiza la parte superior para que apunte a este nuevo nodo. Finalmente, incrementa el tamaño.
// Push element to the top of the stack push(element) { const newNode = new Node(element); newNode.next = this.top; this.top = newNode; this.size ; }
La operación emergente elimina el elemento superior de la pila. Primero comprueba si la pila está vacía. Si es así, devuelve un mensaje de error. De lo contrario, elimina el elemento superior, actualiza el puntero superior al siguiente nodo y disminuye el tamaño. Finalmente, devuelve el elemento eliminado.
// Remove and return the top element pop() { if (this.isEmpty()) { return "Stack is empty"; } const poppedElement = this.top.data; this.top = this.top.next; this.size--; return poppedElement; }
La operación de vista previa devuelve el elemento superior sin eliminarlo. Primero comprueba si la pila está vacía. Si es así, devuelve un mensaje de error. De lo contrario, devuelve los datos del elemento superior.
// Return the top element without removing it peek() { if (this.isEmpty()) { return "Stack is empty"; } return this.top.data; }
La operación isEmpty comprueba si la pila está vacía. Devuelve verdadero si la pila está vacía y falso en caso contrario.
// Check if the stack is empty isEmpty() { return this.size === 0; }
La operación getSize devuelve el tamaño de la pila. Devuelve el número de elementos de la pila.
// Return the size of the stack getSize() { return this.size; }
La operación de impresión imprime la pila. Devuelve los datos del elemento superior.
// Print the stack print() { let current = this.top; let result = ""; while (current) { result = current.data " "; current = current.next; } console.log(result.trim()); }
// Usage example const customStack = new CustomStack(); customStack.push(10); customStack.push(20); customStack.push(30); console.log(customStack.pop()); // 30 console.log(customStack.peek()); // 20 console.log(customStack.getSize()); // 2 console.log(customStack.isEmpty()); // false customStack.print(); // 20 10
En esta implementación, utilizamos una estructura de lista enlazada (lista enlazada individualmente) para representar nuestra pila. Cada elemento es un Nodo con un valor de datos y una referencia al siguiente Nodo. La parte superior de la pila es siempre el nodo agregado más recientemente.
Las pilas son una estructura de datos fundamental en informática que sigue el principio Último en entrar, primero en salir (LIFO). Se utilizan en diversas aplicaciones, incluida la gestión de llamadas a funciones, la implementación de funciones de deshacer y la evaluación de expresiones aritméticas.
En este tutorial, cubrimos los conceptos básicos de las pilas, los pros y los contras de usarlas y su implementación en JavaScript (usando una lista vinculada). Comprender las pilas no se trata solo de saber cómo implementarlas, sino también de reconocer cuándo son la herramienta adecuada para resolver un problema.
A medida que continúe su viaje en el desarrollo de software, descubrirá que las pilas son una herramienta indispensable en su kit de herramientas de resolución de problemas. Son simples pero poderosos, y dominarlos mejorará significativamente su capacidad para diseñar algoritmos y estructuras de datos eficientes.
Para garantizar que no se pierda ninguna parte de esta serie y conectarse conmigo para discusiones más profundas sobre desarrollo de software (web, servidor, móvil o scraping/automatización), estructuras de datos y algoritmos, y otras tecnologías interesantes. temas, sígueme en:
Estén atentos y felices codificando ???
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3