Apilar en C++ STL con ejemplo

โšก Resumen inteligente

Apilar en C++ STL implementa un adaptador de contenedor LIFO que agrega y elimina elementos desde un รบnico extremo, envoltorioping un contenedor de secuencia subyacente, como una cola doble, un vector o una lista, para gestionar datos ordenados.

  • ๐Ÿ”˜ Principio LIFO: La pila estรกndar (std::stack) sigue el orden รšltimo en Entrar, Primero en Salir (LIFO), por lo que el elemento que se ha aรฑadido mรกs recientemente es siempre el primero en eliminarse.
  • ๐Ÿ“ฆ Adaptador de contenedor: Una pila envuelve un contenedor de secuencia existente y, por defecto, utiliza deque cuando no se especifica ningรบn tipo de contenedor.
  • โž• Operaciones principales: Las funciones push, pop y top insertan un elemento, eliminan el elemento superior y leen el elemento superior, respectivamente.
  • ๐Ÿ” Controles estatales: Las funciones empty y size informan si la pila contiene elementos y cuรกntos almacena actualmente.
  • ๐Ÿ” Funciones extra: Las funciones `emplace` y `swap` construyen un elemento in situ e intercambian el contenido de dos pilas.
  • ๐Ÿค– Asistencia de IA: Los asistentes de codificaciรณn basados โ€‹โ€‹en IA, como GitHub Copilot, generan cรณdigo repetitivo para insertar, eliminar y recorrer pilas a partir de un comentario breve.

Apilar en C++ STL

ยฟQuรฉ es std::stack?

Una pila es una estructura de datos que funciona segรบn la tรฉcnica LIFO (Last In First Out). La pila std::stack permite agregar y quitar elementos desde un solo extremo.

La clase `std::stack` es un adaptador de contenedor. Los objetos contenedor almacenan datos de un tipo de dato similar. Se puede crear una pila a partir de varios contenedores de secuencia. Si no se proporciona ningรบn contenedor, se utilizarรก el contenedor `deque` por defecto. 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 โ€“ es el tipo de elemento contenido en std::stack. Puede ser cualquier valido C++ tipo 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:

  • tipo_de_valorโ€“ El primer parรกmetro de la plantilla, T. Indica los tipos de elementos.
  • tipo_de_contenedorโ€“ El segundo parรกmetro de la plantilla, Contenedor. Indica el tipo de contenedor subyacente.
  • tipo_de_tamaรฑoโ€“ Tipo entero sin signo.

Operaciones en pila

A C++ La pila admite las siguientes operaciones bรกsicas:

  • empuje โ€“ Agrega/empuja un elemento a la pila.
  • Deliciosos โ€“ Elimina/extrae un elemento de la pila.
  • ojeada โ€“ Devuelve el elemento superior de la pila sin eliminarlo.
  • estรก lleno โ€“ Comprueba si una pila estรก llena.
  • esta vacio โ€“ Comprueba si una pila estรก vacรญa.

Implementaciรณn de pila

Los siguientes pasos muestran cรณmo cambia la parte superior de la pila a medida que se insertan y luego se extraen elementos:

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 insertado el elemento 5 en la pila. La parte superior de la pila apuntarรก al elemento 5.

Paso 3) A continuaciรณn, hemos insertado el elemento 50 en la pila. La parte superior de la pila se desplaza y apunta al elemento 50.

Paso 4) A continuaciรณn, realizamos una operaciรณn de extracciรณn, eliminando el elemento superior de la pila. El elemento 50 se extrae de la pila. La parte superior de la pila ahora apunta al elemento 5.

Implementaciรณn de pila

empujar() y hacer estallar()

La funciรณn stack::push() agrega 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 tiene la siguiente 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 reciente de la pila. El tamaรฑo de la pila se reduce en 1 despuรฉs de la eliminaciรณn. Esta es 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()

Code Explicaciรณn:

  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 se convierte en 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 la funciรณn empty() 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.
  • Talla()โ€“ Devuelve el tamaรฑo de la pila, es decir, el nรบmero de elementos en una pila.
  • parte superior()โ€“ accede al elemento de la pila que se encuentra 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(), superior()

Aquรญ hay una captura de pantalla del cรณdigo:

vacรญo(), tamaรฑo(), superior()

Code Explicaciรณn:

  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()โ€“ luego construye e inserta un nuevo elemento en la parte superior de la pila.
  • intercambio()โ€“ Intercambia el contenido de una 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() e intercambiar()

Aquรญ hay una captura de pantalla del cรณdigo:

emplazar() e intercambiar()

Code Explicaciรณn:

  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. El final es un C++ palabra clave 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 C++ estructuras de datos. 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 declara 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

Code Explicaciรณn:

  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().

Preguntas Frecuentes

Una pila sigue el orden รšltimo en Entrar, Primero en Salir (LIFO), por lo que elimina primero el elemento mรกs reciente. Una cola sigue el orden Primero en Entrar, Primero en Salir (FIFO), eliminando primero el elemento mรกs antiguo. Cada una se adapta a diferentes necesidades de procesamiento.

Sรญ. std::stack acepta cualquier contenedor de secuencia como su segundo argumento de plantilla, como std::stack La cola doble predeterminada se adapta a la mayorรญa de los casos, mientras que el vector puede mejorar la localidad de la memoria cuando la pila crece de forma predecible.

Tanto la operaciรณn push como la pop se ejecutan en tiempo constante O(1) porque la pila solo accede a su elemento superior. La cola doble subyacente agrega elementos sin modificar los existentes, por lo que el rendimiento se mantiene predecible independientemente del tamaรฑo de la pila.

La pila `std::stack` no expone iteradores, por lo que un bucle basado en rangos no compilarรก. Para leer todos los valores, copie la pila y llame repetidamente a `top()` y `pop()` sobre la copia, o elija una cola doble cuando se requiera recorrerla.

La funciรณn pop() devuelve void por diseรฑo, separando la eliminaciรณn del acceso para mayor seguridad ante excepciones. Leer y eliminar en un solo paso podrรญa provocar la pรฉrdida de datos si la copia genera un error, por lo que primero se llama a top() y luego a pop().

No. La pila `std::stack` no ofrece sincronizaciรณn integrada, por lo que las llamadas concurrentes de inserciรณn y extracciรณn desde mรบltiples hilos provocan condiciones de carrera. Proteja el acceso compartido con un mutex u otro mecanismo de bloqueo antes de usar una pila en varios hilos.

Sรญ. Los asistentes de codificaciรณn de IA leen un comentario o el nombre de una funciรณn y generan declaraciones de std::stack, bucles push y pop, y lรณgica de recorrido. RevRevisar las comprobaciones de lรญmites generadas, como las pruebas empty() antes de pop(), sigue siendo importante para la seguridad de los programas.

Sรญ. Copiloto de GitHub Realiza las llamadas a push, pop, top y empty() mientras escribes y sugiere opciones de contenedores. Es 2026 C++ La inteligencia del cรณdigo aรฑade reconocimiento de sรญmbolos, por lo que las sugerencias de pilas de varios archivos se mantienen coherentes.

Resumir este post con: