Verwendung von STL-Stack-Container in C++
-
Verwenden Sie
std::stack
, um ein Stack-Container-Objekt in C++ zu deklarieren -
Verwenden Sie die Funktion
top()
, um auf das zuletzt hinzugefügte Element in C++ zuzugreifen -
Verwenden Sie die Funktion
swap()
, um den Inhalt von zwei Stapeln in C++ auszutauschen
![Verwendung von STL-Stack-Container in C++](/img/Cpp/feature-image---stack-in-cpp.webp)
Dieser Artikel zeigt mehrere Methoden zur Verwendung des STL-stack
-Containers in C++.
Verwenden Sie std::stack
, um ein Stack-Container-Objekt in C++ zu deklarieren
std::stack
wird als Container-Adapter bezeichnet, der als Wrapper von Standard-Containern fungieren kann, aber begrenzte und spezielle Funktionen bietet. Als Beispiel bietet die Klasse std::stack
eine LIFO-Datenstruktur (last-in, first-out) und kann auf einen darunter liegenden std::vector
- oder std::deque
-Container abgebildet werden. std::stack
kann mit einem anderen stack
-Objekt oder kompatiblen Sequenzcontainern wie deque
, vector
und list
initialisiert werden. Beachten Sie jedoch, dass der Standardcontainer, der zum Speichern der stack
-Elemente verwendet wird, deque
ist. Außerdem gibt es keinen Konstruktor, der die direkte Übergabe der Initialisierungsliste oder der Elemente unterstützt. Wir müssen die push
-Methode verwenden, sobald das stack
-Objekt deklariert wurde.
Beachten Sie, dass das stack
-Objekt nicht mit der bereichsbasierten Schleife iteriert werden kann. Daher implementieren wir eine spezielle while
-Schleife, um jedes Element in den cout
-Stream auszugeben. Die Funktion printStack
nimmt das Argument stack
, aber st1
, das vom vector
-Objekt initialisiert wurde, kann nicht an sie übergeben werden, da sich die Typen dieser beiden Objekte unterscheiden und der Compiler den Fehler ausgibt.
#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;
}
Verwenden Sie die Funktion top()
, um auf das zuletzt hinzugefügte Element in C++ zuzugreifen
Die Funktion top()
ist eine Member-Funktion, die das oberste Element im Stack zurückgibt. Beachten Sie, dass diese Funktion ein zurückgegebenes Element nicht automatisch aus dem stack
-Objekt entfernt. Man sollte die Member-Funktion pop
aufrufen, um sie zu entfernen.
#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;
}
Ausgabe:
top of the stack st2: 120
Verwenden Sie die Funktion swap()
, um den Inhalt von zwei Stapeln in C++ auszutauschen
Die Funktion swap()
ist eine Memberfunktion des Containers stack
. Es nimmt eine Referenz auf das Objekt stack
und tauscht Elemente aus diesen Stapeln aus. Beachten Sie, dass das Objekt st1
, das mit dem Objekt vector
initialisiert wird, weder die Funktion swap()
aufrufen oder ein Argument dafür sein kann. Damit der containerinitialisierte stack
mit der Funktion swap
verwendet werden kann, muss er mit dem std::move
-Aufruf erstellt werden, da im folgenden Codebeispiel das st3
-Objekt initialisiert wird. Letzteres kann auch problemlos an die Funktion printStack
übergeben werden. Schließlich tauschen wir Elemente von st2
/st3
-Stack-Objekten aus und geben die Ergebnisse an die Konsole aus.
#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;
}
Ausgabe:
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