Usa il contenitore stack STL in C++

Jinku Hu 12 ottobre 2023
  1. Usa std::stack per dichiarare un oggetto contenitore stack in C++
  2. Usa la funzione top() per accedere all’elemento aggiunto più di recente in C++
  3. Usa la funzione swap() per scambiare i contenuti di due stack in C++
Usa il contenitore stack STL in C++

Questo articolo dimostrerà più metodi su come utilizzare il contenitore stack STL in C++.

Usa std::stack per dichiarare un oggetto contenitore stack in C++

std::stack è chiamato adattatore contenitore, che può fungere da wrapper di contenitori standard ma fornisce funzionalità limitate e specializzate. Ad esempio, la classe std::stack fornisce una struttura dati LIFO (last-in, first-out) e può essere mappata a un contenitore std::vector o std::deque sottostante. std::stack può essere inizializzato con un altro oggetto stack o contenitori di sequenze compatibili come deque, vector e list. Nota, tuttavia, il contenitore predefinito utilizzato per memorizzare gli elementi stack è deque. Inoltre, non esiste un costruttore che supporti il ​​passaggio diretto della lista o degli elementi dell’inizializzatore. Dobbiamo usare il metodo push una volta che l’oggetto stack è stato dichiarato.

Si noti che l’oggetto stack non può essere iterato utilizzando il bucle basato sull’intervallo. Pertanto, implementiamo uno speciale cicli while per stampare ogni elemento nel flusso cout. La funzione printStack accetta l’argomento stack, ma st1 che è stato inizializzato dall’oggetto vector non può essere passato ad esso, poiché i tipi di questi due oggetti differiscono e il compilatore genera l’errore.

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

Usa la funzione top() per accedere all’elemento aggiunto più di recente in C++

La funzione top() è una funzione membro che restituisce l’elemento in cima allo stack. Si noti che questa funzione non rimuove automaticamente un elemento restituito dall’oggetto stack. Si dovrebbe chiamare la funzione membro pop per rimuoverlo.

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

Produzione:

top of the stack st2: 120

Usa la funzione swap() per scambiare i contenuti di due stack in C++

La funzione swap() è una funzione membro del contenitore stack. Prende un riferimento all’oggetto stack e scambia gli elementi da questi stack. Si noti che, l’oggetto st1, che viene inizializzato utilizzando l’oggetto vector, non può chiamare la funzione swap o essere un argomento per essa. Per poter utilizzare lo stack inizializzato del contenitore con la funzione swap, è necessario crearlo utilizzando la chiamata std::move, poiché l’oggetto st3 è inizializzato nel seguente esempio di codice. Quest’ultimo può anche essere passato alla funzione printStack senza problemi. Infine, scambiamo gli elementi degli oggetti impilati st2/st3 e stampiamo i risultati sulla 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;
}

Produzione:

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