Utilice el contenedor de pila STL en C++
-
Utilice
std::stack
para declarar un objeto contenedor de pila en C++ -
Utilice la función
top()
para acceder al elemento agregado más recientemente en C++ -
Utilice la función
swap()
para intercambiar contenidos de dos pilas en C++
Este artículo demostrará varios métodos sobre cómo usar el contenedor STL stack
en C++.
Utilice std::stack
para declarar un objeto contenedor de pila en C++
std::stack
se denomina adaptador de contenedor, que puede actuar como envoltorio de contenedores estándar, pero proporciona una funcionalidad limitada y especializada. Como ejemplo, la clase std::stack
proporciona una estructura de datos LIFO (último en entrar, primero en salir) y se puede asignar a un contenedor std::vector
o std::deque
debajo. std::stack
se puede inicializar con otro objeto stack
o contenedores de secuencia compatibles como deque
,vector
y list
. Sin embargo, tenga en cuenta que el contenedor predeterminado que se utiliza para almacenar los elementos stack
es deque
. Además, no hay ningún constructor que admita pasar la lista o los elementos del inicializador directamente. Necesitamos usar el método push
una vez que el objeto stack
ha sido declarado.
Tenga en cuenta que, el objeto stack
no se puede iterar mediante el uso del bucle basado en rangos. Por lo tanto, implementamos un bucle especial while
para imprimir cada elemento en la secuencia cout
. La función printStack
toma el argumento stack
, pero st1
que fue inicializado por el objeto vector
no se le puede pasar, ya que los tipos de estos dos objetos difieren y el compilador arroja el error.
#include <iostream>
#include <stack>
#include <vector>
using std::cout;
using std::endl;
using std::stack;
using std::vector;
template <typename T>
void printStack(stack<T> s) {
while (!s.empty()) {
cout << s.top() << "; ";
s.pop();
}
cout << endl;
}
int main() {
vector<int> vec1 = {1, 2, 3, 4, 11};
stack st1{vec1};
stack<int> st2;
for (int i = 1; i <= 10; ++i) {
st2.push(i * 12);
}
// printStack(st1); Error - no matching function
printStack(st2);
return EXIT_SUCCESS;
}
Utilice la función top()
para acceder al elemento agregado más recientemente en C++
La función top()
es una función miembro que devuelve el elemento superior de la pila. Tenga en cuenta que esta función no elimina automáticamente un elemento devuelto del objeto stack
. Uno debe llamar a la función miembro pop
para eliminarlo.
#include <iostream>
#include <stack>
using std::cout;
using std::endl;
using std::stack;
int main() {
stack<int> st2;
for (int i = 1; i <= 10; ++i) {
st2.push(i * 12);
}
cout << "top of the stack st2: ";
cout << st2.top() << endl;
return EXIT_SUCCESS;
}
Producción :
top of the stack st2: 120
Utilice la función swap()
para intercambiar contenidos de dos pilas en C++
La función swap()
es una función miembro del contenedor stack
. Toma una referencia al objeto stack
e intercambia elementos de estas pilas. Observe que, el objeto st1
, que se inicializa usando el objeto vector
, no puede llamar a la función swap
o ser un argumento para ella. Para permitir que la stack
inicializada del contenedor se utilice con la función swap
, debe crearse utilizando la llamada std::move
, ya que el objeto st3
se inicializa en el siguiente ejemplo de código. Este último también se puede pasar a la función printStack
sin ningún problema. Finalmente, intercambiamos elementos de los objetos de pila st2
/ st3
e imprimimos los resultados en la consola.
#include <deque>
#include <iostream>
#include <stack>
#include <vector>
using std::cout;
using std::deque;
using std::endl;
using std::stack;
using std::vector;
template <typename T>
void printStack(stack<T> s) {
while (!s.empty()) {
cout << s.top() << "; ";
s.pop();
}
cout << endl;
}
int main() {
deque<int> deq1 = {11, 12, 13, 14};
vector<int> vec1 = {1, 2, 3, 4, 11};
stack st1{vec1};
stack<int> st2;
for (int i = 1; i <= 10; ++i) {
st2.push(i * 12);
}
// st2.swap(st1); Error
stack<int> st3{std::move(deq1)};
printStack(st2);
printStack(st3);
st2.swap(st3);
printStack(st2);
printStack(st3);
return EXIT_SUCCESS;
}
Producción :
120; 108; 96; 84; 72; 60; 48; 36; 24; 12;
14; 13; 12; 11;
14; 13; 12; 11;
120; 108; 96; 84; 72; 60; 48; 36; 24; 12;
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook