Verwendung von STL-Stack-Container in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie std::stack, um ein Stack-Container-Objekt in C++ zu deklarieren
  2. Verwenden Sie die Funktion top(), um auf das zuletzt hinzugefügte Element in C++ zuzugreifen
  3. Verwenden Sie die Funktion swap(), um den Inhalt von zwei Stapeln in C++ auszutauschen
Verwendung von STL-Stack-Container in C++

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