Apilar en C++ STL con ejemplo

¿Qué es std::stack?

Una pila es una estructura de datos que opera según la técnica LIFO (Last In First Out). std::stack permite agregar y eliminar elementos desde un solo extremo.

La clase std::stack es un adaptador de contenedor. Los objetos contenedores contienen datos de un tipo de datos similar. Puede crear una pila a partir de varios contenedores de secuencias. Si no se proporciona ningún contenedor, el contenedor deque se utilizará de forma predeterminada. Los adaptadores de contenedor no admiten iteradores, por lo que no se pueden utilizar para manipular datos.

Sintaxis de pila

Para crear una pila, debemos incluir el archivo de encabezado en nuestro código. Luego usamos esta sintaxis para definir std::stack:

template <class Type, class Container = deque<Type> > class stack;
  • Tipo de Propiedad – es el tipo de elemento contenido en std::stack. Puede ser cualquier tipo C++ válido o incluso un tipo definido por el usuario.
  • Envase – es el tipo de objeto contenedor subyacente.

Tipos de miembros

Estos son los tipos de miembros de la pila:

  • value_type: el primer parámetro de plantilla, T. Denota los tipos de elementos.
  • container_type: el segundo parámetro de plantilla, Container. Denota el tipo de contenedor subyacente.
  • size_type: tipo integral sin signo.

Operaciones en pila

A C + + la pila admite lo siguientewing operaciones básicas:

  • push: agrega/empuja un elemento a la pila.
  • pop: elimina/saca un elemento de la pila.
  • vistazo: devuelve el elemento superior de la pila sin eliminarlo.
  • isFull: comprueba si una pila está llena.
  • isEmpty: comprueba si una pila está vacía.

Implementación de pila

Implementación de pila

Paso 1) Inicialmente tenemos una pila vacía. La parte superior de una pila vacía se establece en -1.

Paso 2) A continuación, hemos empujado el elemento 5 a la pila. La parte superior de la pila apuntará al elemento 5.

Paso 3) A continuación, hemos empujado el elemento 50 a la pila. La parte superior de la pila se desplaza y apunta al elemento 50.

Paso 4) Luego realizamos una operación emergente, eliminando el elemento superior de la pila. El elemento 50 sale de la pila. La parte superior de la pila ahora apunta al elemento 5.

empujar() y hacer estallar()

Las funciones stack::push() agregan un nuevo elemento a la parte superior de la pila. El tamaño de la pila aumenta en 1 después de la inserción. La función toma esta sintaxis:

stack.push(value)

El valor es el elemento que se insertará en la pila.

La función stack:: pop() elimina el elemento superior de la pila. Este es el elemento más nuevo de la pila. El tamaño de la pila se reduce en 1 después de la eliminación. Aquí está la sintaxis de la función:

stack.pop()

La función no toma parámetros.

Ejemplo 1:

#include <iostream> 
#include <stack> 
using namespace std;
int main() {
	stack<int> st;
	st.push(10);
	st.push(20);
	st.push(30);
	st.push(40);
	
         st.pop();
	st.pop();

	while (!st.empty()) {
		cout << ' ' << st.top();
		st.pop();
	}
}

Salida:

empujar() y hacer estallar()

Aquí hay una captura de pantalla del código:

empujar() y hacer estallar()

Explicación del código:

  1. Incluya el archivo de encabezado iostream en nuestro código para usar sus funciones.
  2. Incluya el archivo de encabezado de la pila en nuestro código para usar sus funciones.
  3. Incluya el espacio de nombres estándar en nuestro código para usar sus clases sin llamarlo.
  4. Llame a la función principal(). La lógica del programa debe agregarse dentro de esta función.
  5. Cree una pila st para almacenar valores enteros.
  6. Utilice la función push() para insertar el valor 10 en la pila.
  7. Utilice la función push() para insertar el valor 20 en la pila.
  8. Utilice la función push() para insertar el valor 30 en la pila.
  9. Utilice la función push() para insertar el valor 40 en la pila.
  10. Utilice la función pop() para eliminar el elemento superior de la pila, es decir, 40. El elemento superior ahora pasa a ser 30.
  11. Utilice la función pop() para eliminar el elemento superior de la pila, es decir, 30. El elemento superior ahora se convierte en 20.
  12. Utilice un bucle while y una función vacía() para comprobar si la pila NO está vacía. El ! es el operador NOT.
  13. Imprimir el contenido actual de la pila en la consola.
  14. Llame a la función pop() en la pila.
  15. Fin del cuerpo del bucle while.
  16. Fin del cuerpo de la función main().

vacío(), tamaño(), superior()

Las pilas tienen funciones incorporadas que puedes usar para jugar con la pila y sus valores. Éstas incluyen:

  • vacío(): comprueba si una pila está vacía o no.
  • size(): devuelve el tamaño de la pila, es decir, el número de elementos de una pila.
  • top(): accede al elemento de la pila en la parte superior.

Ejemplo 2:

#include <iostream> 
#include <stack>  
using namespace std;
void createStack(stack <int> mystack)
{
	stack <int> ms = mystack;
	while (!ms.empty())
	{
		cout << '\t' << ms.top();
		ms.pop();
	}
	cout << '\n';
}
int main()
{
	stack <int> st;
	st.push(32);
	st.push(21);
	st.push(39);
	st.push(89);
	st.push(25);

	cout << "The stack st is: ";
	createStack(st);
	cout << "\n st.size() : " << st.size();
	cout << "\n st.top() : " << st.top();
	cout << "\n st.pop() : ";
	st.pop();
	createStack(st);
	return 0;
}

Salida:

vacío(),tamaño(),arriba()

Aquí hay una captura de pantalla del código:

vacío(),tamaño(),arriba()

Explicación del código:

  1. Incluya el archivo de encabezado iostream en nuestro código para poder utilizar sus funciones.
  2. Incluya el archivo de encabezado de la pila en nuestro código para poder utilizar sus funciones.
  3. Incluya el espacio de nombres estándar en nuestro programa para poder usar sus clases sin llamarlo.
  4. Crea la función createStack que podemos usar para crear la pila mystack. La pila contendrá un conjunto de números enteros.
  5. El comienzo del cuerpo de la función createStack.
  6. Cree una instancia del tipo de datos mystack y asígnele el nombre ms.
  7. Utilice el bucle while y la función vacía() para comprobar si la pila está vacía.
  8. El inicio del cuerpo del bucle while.
  9. Utilice la función top() almacenada en la parte superior de la pila. El carácter \t creará una nueva pestaña.
  10. Utilice la función pop() para eliminar el elemento en la parte superior de la pila.
  11. Fin del cuerpo del bucle while.
  12. Imprime una línea en blanco en la consola.
  13. Fin del cuerpo de la función createStack.
  14. Llame a la función principal(). La lógica del programa debe agregarse dentro del cuerpo de la función main().
  15. El inicio del cuerpo de la función main().
  16. Crea un objeto de pila st.
  17. Utilice la función push() para insertar el elemento 32 en la pila.
  18. Utilice la función push() para insertar el elemento 21 en la pila.
  19. Utilice la función push() para insertar el elemento 39 en la pila.
  20. Utilice la función push() para insertar el elemento 89 en la pila.
  21. Utilice la función push() para insertar el elemento 25 en la pila.
  22. Imprime algo de texto en la consola.
  23. Llame a la función createStack para ejecutar las operaciones de inserción anteriores en la pila.
  24. Imprima el tamaño de la pila en la consola junto con otro texto.
  25. Imprime el elemento en la parte superior de la pila en la consola.
  26. Imprime algo de texto en la consola.
  27. Elimina el elemento en la parte superior de la pila. Luego devolverá los elementos que quedan en la pila.
  28. Llame a la función createStack para ejecutar las operaciones anteriores.
  29. El programa debe devolver valor una vez completado con éxito.
  30. Fin del cuerpo de la función main().

emplazar() e intercambiar()

Estas son otras funciones de pila incorporadas:

  • emplace(): construye y luego inserta un nuevo elemento en la parte superior de la pila.
  • swap(): intercambia el contenido de la pila con el contenido de otra pila.

Ejemplo 3:

#include <iostream>    
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st1;
	stack<int> st2;

	st1.emplace(12);
	st1.emplace(19);

	st2.emplace(20);
	st2.emplace(23);

	st1.swap(st2);

	cout << "st1 = ";
	while (!st1.empty()) {
		cout << st1.top() << " ";
		st1.pop();
	}

	cout << endl << "st2 = ";
	while (!st2.empty()) {
		cout << st2.top() << " ";
		st2.pop();
	}
}

Salida:

emplazar()& intercambiar()

Aquí hay una captura de pantalla del código:

emplazar()& intercambiar()

Explicación del código:

  1. Incluya el archivo de encabezado iostream en nuestro código para usar sus funciones.
  2. Incluya el archivo de encabezado de la pila en nuestro código para usar sus funciones.
  3. Incluya el archivo de encabezado cstdlib en nuestro código para usar sus funciones.
  4. Incluya el espacio de nombres estándar en nuestro código para usar sus clases sin llamarlo.
  5. Llame a la función principal(). La lógica del programa se agregará dentro del cuerpo de esta función.
  6. Declare una pila llamada st1 para almacenar valores enteros.
  7. Declare una pila llamada st2 para almacenar valores enteros.
  8. Utilice la función emplace() para insertar el número entero 12 en la pila denominada st1.
  9. Utilice la función emplace() para insertar el número entero 19 en la pila denominada st1.
  10. Utilice la función emplace() para insertar el número entero 20 en la pila denominada st2.
  11. Utilice la función emplace() para insertar el número entero 23 en la pila denominada st2.
  12. Utilice la función swap() para intercambiar el contenido de las dos pilas, st1 y st2. El contenido de la pila st1 debe moverse a la pila st2. El contenido de la pila st2 debe moverse a la pila st1.
  13. Imprime algo de texto en la consola.
  14. Utilice la instrucción while y la función vacía() para comprobar si la pila st1 no está vacía.
  15. Imprime el contenido de la pila st1 en la consola. El " " agrega espacio entre los elementos de la pila al imprimirlos en la consola.
  16. Ejecute la función pop() en la pila st1 para eliminar el elemento superior.
  17. Fin del cuerpo de la declaración while.
  18. Imprime algo de texto en la consola. endl es una palabra clave de C++ para la línea final. Mueve el cursor del mouse a la siguiente línea para comenzar a imprimir desde allí.
  19. Utilice la instrucción while y la función vacía() para comprobar si la pila st2 no está vacía.
  20. Imprime el contenido de la pila st2 en la consola. El " " agrega espacio entre los elementos de la pila al imprimirlos en la consola.
  21. Ejecute la función pop() en la pila st2 para eliminar el elemento superior.
  22. Fin del cuerpo de la declaración while.
  23. Fin del cuerpo de la función main().

Apilar en STL

La STL (Biblioteca de plantillas estándar) viene con clases de plantillas que proporcionan estructuras de datos C++ comunes. Por lo tanto, también se puede implementar una pila en STL. Simplemente incluimos esta biblioteca en nuestro código y la usamos para definir una pila.

stack<T> st; 

La sintaxis anterior declares una pila st a elementos del tipo de datos T.

Ejemplo 4:

#include <iostream>      
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st;
	st.push(12);
	st.push(19);
	st.push(20);
	cout << st.top();   
	cout << st.size();  
}

Salida:

Apilar en STL

Aquí hay una captura de pantalla del código:

Apilar en STL

Explicación del código:

  1. Incluya el archivo de encabezado iostream en nuestro código para usar sus funciones.
  2. Incluya el archivo de encabezado de la pila en nuestro código para usar sus funciones.
  3. Incluya el archivo de encabezado cstdlib en nuestro código para usar sus funciones.
  4. Incluya el espacio de nombres estándar en nuestro código para usar sus clases sin llamarlo.
  5. Llame a la función principal(). La lógica del programa debe agregarse dentro del cuerpo de esta función.
  6. Declare una pila st para almacenar datos enteros.
  7. Agrega el elemento 12 a la pila.
  8. Agrega el elemento 19 a la pila.
  9. Agrega el elemento 20 a la pila.
  10. Imprime el elemento en la parte superior de la pila en la consola.
  11. Imprime el tamaño de la pila en la consola.
  12. Fin del cuerpo de la función main().

Resumen

  • Una pila es una estructura de datos que opera según la técnica LIFO (Last In first Out).
  • El std::stack solo permite agregar y eliminar elementos desde un extremo.
  • La clase std::stack es un adaptador de contenedor que contiene elementos de un tipo de datos similar.
  • Se puede crear una pila a partir de varios contenedores de secuencias.
  • Si no proporciona un contenedor, el contenedor deque se utilizará de forma predeterminada.
  • La función push() es para insertar elementos en la pila.
  • La función pop() sirve para eliminar el elemento superior del paso.
  • La función vacía() sirve para comprobar si una pila está vacía o no.