Utiliser STL Stack Container en C++

Jinku Hu 12 octobre 2023
  1. Utilisez std::stack pour déclarer l’objet conteneur de pile en C++
  2. Utilisez la fonction top() pour accéder à l’élément le plus récemment ajouté en C++
  3. Utilisez la fonction swap() pour échanger le contenu de deux piles en C++
Utiliser STL Stack Container en C++

Cet article présentera plusieurs méthodes sur l’utilisation du conteneur STL stack en C++.

Utilisez std::stack pour déclarer l’objet conteneur de pile en C++

std::stack est appelé un adaptateur de conteneur, qui peut agir comme enveloppe de conteneurs standard mais fournit des fonctionnalités limitées et spécialisées. Par exemple, la classe std::stack fournit une structure de données LIFO (dernier entré, premier sorti) et elle peut être mappée à un conteneur std::vector ou std::deque en dessous. std::stack peut être initialisé avec un autre objet stack ou des conteneurs de séquence compatibles comme deque, vector et list. Notez, cependant, que le conteneur par défaut utilisé pour stocker les éléments stack est deque. De plus, il n’y a pas de constructeur pour prendre en charge la transmission directe de la liste d’initialisation ou des éléments. Nous devons utiliser la méthode push une fois que l’objet stack a été déclaré.

Notez que l’objet stack ne peut pas être itéré en utilisant la boucle basée sur la plage. Ainsi, nous implémentons une boucle spéciale while pour imprimer chaque élément dans le flux cout. La fonction printStack prend l’argument stack, mais st1 qui a été initialisé par l’objet vector ne peut pas lui être transmis, car les types de ces deux objets diffèrent et le compilateur renvoie l’erreur.

#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;
}

Utilisez la fonction top() pour accéder à l’élément le plus récemment ajouté en C++

La fonction top() est une fonction membre qui renvoie l’élément supérieur de la pile. Notez que cette fonction ne supprime pas automatiquement un élément renvoyé de l’objet stack. Il faut appeler la fonction membre pop pour la supprimer.

#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;
}

Production:

top of the stack st2: 120

Utilisez la fonction swap() pour échanger le contenu de deux piles en C++

La fonction swap() est une fonction membre du conteneur stack. Il prend une référence à l’objet stack et échange les éléments de ces piles. Notez que l’objet st1, qui est initialisé à l’aide de l’objet vector, ne peut pas appeler la fonction swap ou être un argument de celle-ci. Afin de permettre au conteneur initialisé stack d’être utilisé avec la fonction swap, il doit être créé à l’aide de l’appel std::move, car l’objet st3 est initialisé dans l’exemple de code suivant. Ce dernier peut également être passé à la fonction printStack sans aucun problème. Enfin, nous échangeons les éléments des objets de pile st2/st3 et imprimons les résultats sur la console.

#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;
}

Production:

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;
Auteur: 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