Utilice el contenedor de pila STL en C++

Jinku Hu 12 octubre 2023
  1. Utilice std::stack para declarar un objeto contenedor de pila en C++
  2. Utilice la función top() para acceder al elemento agregado más recientemente en C++
  3. Utilice la función swap() para intercambiar contenidos de dos pilas en C++
Utilice el contenedor de pila STL 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;
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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