Usa il contenitore stack STL in C++
-
Usa
std::stack
per dichiarare un oggetto contenitore stack in C++ -
Usa la funzione
top()
per accedere all’elemento aggiunto più di recente in C++ -
Usa la funzione
swap()
per scambiare i contenuti di due stack 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;
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