stack data structure c with illustration
cómo crear un árbol de búsqueda binario en java
Todo lo que necesita saber sobre Stack en C ++.
Stack es una estructura de datos fundamental que se utiliza para almacenar elementos de forma lineal.
Stack sigue LIFO (último en entrar, primero en salir) orden o enfoque en el que se realizan las operaciones. Esto significa que el último elemento que se agregó a la pila será el primer elemento que se eliminará de la pila.
=> Visite aquí para ver la serie completa de capacitación en C ++ para todos.
Lo que vas a aprender:
- Apilar en C ++
Apilar en C ++
Una pila es similar a una pila de la vida real o una pila de cosas que apilamos una encima de la otra.
A continuación se muestra una representación pictórica de Stack.
Como se muestra arriba, hay una pila de platos apilados uno encima del otro. Si queremos agregarle otro elemento, lo agregamos en la parte superior de la pila como se muestra en la figura anterior (lado izquierdo). Esta operación de agregar un elemento a la pila se llama ' Empujar ”.
En el lado derecho, mostramos una operación opuesta, es decir, eliminamos un elemento de la pila. Esto también se hace desde el mismo extremo, es decir, la parte superior de la pila. Esta operación se llama ' Pop ”.
Como se muestra en la figura anterior, vemos que push y pop se realizan desde el mismo extremo. Esto hace que la pila siga el orden LIFO. La posición o el extremo desde el que se introducen o salen los elementos de la pila se denomina ' Parte superior de la pila ”.
Inicialmente, cuando no hay elementos en la pila, la parte superior de la pila se establece en -1. Cuando agregamos un artículo a la pila, la parte superior de la pila se incrementa en 1, lo que indica que se agregó el artículo. A diferencia de esto, la parte superior de la pila se reduce en 1 cuando un elemento sale de la pila.
A continuación, veremos algunas de las operaciones básicas de la estructura de datos de la pila que necesitaremos al implementar la pila.
Operaciones básicas
A continuación se muestran las operaciones básicas que admite la pila.
- empujar - Agrega o inserta un elemento en la pila.
- pop – Elimina o saca un elemento de la pila.
- mirar - Obtiene el elemento superior de la pila pero no lo elimina.
- está lleno - Comprueba si la pila está llena.
- esta vacio - Comprueba si la pila está vacía.
Ilustración
La ilustración anterior muestra la secuencia de operaciones que se realizan en la pila. Inicialmente, la pila está vacía. Para una pila vacía, la parte superior de la pila se establece en -1.
A continuación, empujamos el elemento 10 a la pila. Vemos que la parte superior de la pila ahora apunta al elemento 10.
A continuación, realizamos otra operación de empuje con el elemento 20, como resultado de lo cual la parte superior de la pila ahora apunta a 20. Este estado es la tercera figura.
Ahora, en la última figura, realizamos una operación pop (). Como resultado de la operación pop, el elemento que apunta a la parte superior de la pila se elimina de la pila. Por tanto, en la figura, vemos que el elemento 20 se retira de la pila. Por lo tanto, la parte superior de la pila ahora apunta a 10.
De esta manera, podemos distinguir fácilmente el enfoque LIFO utilizado por stack.
Implementación
# 1) Uso de matrices
A continuación se muestra la implementación de C ++ de la pila usando matrices:
|_+_|Producción:
El empuje de la pila
2
4
6
El Stack Pop:
6
4
2
En la salida, podemos ver que los elementos se insertan en la pila en un orden y se extraen de la pila en el orden inverso. Esto muestra el enfoque LIFO (último en entrar, primero en salir) para la pila.
Para la implementación de matriz anterior de la pila, podemos concluir que esto es muy fácil de implementar ya que no hay punteros involucrados. Pero al mismo tiempo, el tamaño de la pila es estático y la pila no puede crecer ni reducirse dinámicamente.
A continuación, implementaremos la pila utilizando matrices en lenguaje de programación Java.
|_+_|Producción:
Empuje de pila:
1
3
5
Stack Pop:
5
3
1
La lógica de implementación es la misma que en la implementación de C ++. La salida muestra la técnica LIFO de empujar hacia adentro y hacia afuera de los elementos hacia / desde la pila.
Como ya se ha dicho, la implementación de la pila utilizando matrices es la implementación más simple, pero es de naturaleza estática, ya que no podemos hacer crecer o reducir la pila de forma dinámica.
# 2) Usar una lista vinculada
A continuación, implementamos operaciones de pila utilizando una lista vinculada tanto en C ++ como en Java. Primero, demostraremos la implementación de C ++.
|_+_|Producción:
Empuje de pila:
100
200
300
El elemento superior es 300
Stack Pop:
300
200
100
El elemento superior es -1
A continuación, presentamos la implementación de Java de la pila utilizando una lista vinculada.
|_+_|Producción:
Empuje de pila:
100
200
300
El elemento superior es 300
Stack Pop:
300
para generar un número aleatorio, puede usar la función rand del archivo de encabezado
200
100
La pila está vacía
El elemento superior es -2147483648
Acabamos de ver implementaciones de C ++ y Java para una pila usando listas enlazadas. Representamos cada entrada de la pila como un nodo de la lista vinculada. La ventaja más importante de esta implementación es que es dinámica. Esto significa que podemos aumentar o reducir el tamaño de la pila según nuestros requisitos.
Esto es diferente al caso de la implementación de pila usando arreglos en los que tenemos que declarar el tamaño de antemano y no podemos cambiarlo dinámicamente.
La desventaja de esta implementación es que, como usamos punteros en todas partes, ocupa demasiado espacio en comparación con la implementación de una matriz.
Aplicaciones de Stack
Analicemos algunas de las aplicaciones de la estructura de datos de pila. La estructura de datos de pila se usa en una variedad de aplicaciones en la programación de software principalmente debido a su simplicidad y facilidad de implementación.
A continuación, describiremos brevemente algunas de las aplicaciones de la pila:
# 1) Expresiones de infijo a sufijo
Cualquier expresión aritmética general tiene la forma operando 1 OP operando 2 .
Según la posición del operador OP, tenemos los siguientes tipos de expresiones:
- Infijo - La forma general de expresión infija es ' operando 1 OP operando 2 ”. Esta es la forma básica de la expresión y la usamos en matemáticas todo el tiempo.
- Prefijo - Cuando un operador se coloca antes de los operandos, es una expresión de prefijo. La forma general de expresión infija es ' OP operando1 operando2 ”.
- Sufijo - En expresiones de sufijo, los operandos se escriben primero seguidos por el operador. Tiene la forma “operando1 operando2 OP”.
Considere la expresión 'a + b * c ” . El compilador escanea la expresión de izquierda a derecha o de derecha a izquierda. Teniendo cuidado de la precedencia y la asociatividad del operador, primero escaneará la expresión para evaluar la expresión b * c. A continuación, tendrá que escanear nuevamente la expresión para agregar el resultado de b * c a a.
A medida que las expresiones se vuelven cada vez más complejas, este tipo de enfoque de escanear la expresión una y otra vez se vuelve ineficaz.
Para superar esta ineficiencia, convertimos la expresión en sufijo o prefijo de modo que puedan evaluarse fácilmente utilizando una estructura de datos de pila.
# 2) Análisis / evaluación de expresiones
Usando stack, también podemos realizar una evaluación de expresión real. En esto, la expresión se escanea de izquierda a derecha y los operandos se insertan en la pila.
Siempre que se encuentra un operador, los operandos se extraen y se realiza la operación. El resultado de la operación vuelve a introducirse en la pila. De esta manera, la expresión se evalúa mediante el uso de la pila y el resultado final de la expresión suele ser la parte superior actual de la pila.
# 3) Travesías de árboles
La estructura de datos del árbol se puede recorrer para visitar cada nodo de muchas formas y dependiendo de cuándo se visita el nodo raíz que tenemos.
- inOrder transversal
- Preorder Traversal
- postOrder transversal
Para atravesar el árbol de manera eficiente, utilizamos la estructura de datos de la pila para empujar los nodos intermedios en la pila de modo que mantengamos el orden de recorrido.
# 4) Algoritmos de clasificación
Los algoritmos de clasificación como la clasificación rápida se pueden hacer más eficientes utilizando las estructuras de datos de la pila.
# 5) Torres de Hanoi
Este es un problema clásico que involucra un número n de discos y tres torres y el problema consiste en mover los discos de una torre a otra con la tercera torre utilizada como intermedia.
Este problema se puede abordar de manera eficiente utilizando la pila mientras empujamos los discos para moverlos a la pila, ya que la pila actúa básicamente como una torre utilizada para mover los discos.
Conclusión
La pila es la estructura de datos más simple y más fácil de implementar como programa. Usó el enfoque LIFO (último en entrar, primero en salir), lo que significa que el elemento ingresado en último lugar es el que se elimina primero. Esto se debe a que la pila usa solo un extremo para agregar (empujar) y eliminar (pop) elementos.
La estructura de datos de la pila tiene muchos usos en la programación de software. El más destacado entre ellos son las evaluaciones de expresión. La evaluación de expresiones también incluye convertir la expresión de infijo a sufijo o prefijo. También implica evaluar la expresión para producir el resultado final.
En este tutorial, hemos visto la ilustración y la implementación de la pila, así como sus diversas operaciones.
En nuestro próximo tutorial, aprenderemos sobre la estructura de datos de la cola en detalle.
=> Visite aquí para obtener el curso completo de C ++ de expertos.
Lectura recomendada
- Estructura de datos de cola en C ++ con ilustración
- Estructura de datos de lista enlazada circular en C ++ con ilustración
- Estructura de datos de lista vinculada en C ++ con ilustración
- Estructura de datos de cola de prioridad en C ++ con ilustración
- Estructura de datos de lista doblemente enlazada en C ++ con ilustración
- Introducción a las estructuras de datos en C ++
- Parametrización de datos de JMeter usando variables definidas por el usuario
- Las 10 mejores herramientas de recopilación de datos con estrategias de recopilación de datos