Stapeln Sie ein C++ STL mit Beispiel

โšก Intelligente Zusammenfassung

Stapeln Sie ein C++ STL implementiert einen LIFO-Containeradapter, der Elemente von einem Ende hinzufรผgt und entfernt, umschlieรŸt.ping Ein zugrundeliegender Sequenzcontainer wie Deque, Vektor oder Liste zur Verwaltung geordneter Daten.

  • ๐Ÿ”˜ LIFO-Prinzip: Der std::stack folgt dem LIFO-Prinzip (Last In First Out), daher wird das zuletzt hinzugefรผgte Element immer als erstes entfernt.
  • ๐Ÿ“ฆ Container-Adapter: Ein Stack umschlieรŸt einen vorhandenen Sequenzcontainer und verwendet standardmรครŸig eine Deque, wenn kein Containertyp angegeben wird.
  • โž• Kernoperationen: Die Funktionen push, pop und top fรผgen ein Element ein, entfernen das oberste Element bzw. lesen das oberste Element aus.
  • ๐Ÿ” Staatliche รœberprรผfungen: Die Funktionen empty und size geben an, ob der Stack Elemente enthรคlt und wie viele er aktuell speichert.
  • ๐Ÿ” Zusatzfunktionen: Die Funktionen emplace und swap erstellen ein Element an Ort und Stelle und tauschen den Inhalt zweier Stacks aus.
  • ๐Ÿค– KI-Unterstรผtzung: KI-Programmierassistenten wie GitHub Copilot generieren aus einem kurzen Kommentar Stack-Push-, Stack-Pop- und Traversierungs-Boilerplate-Code.

Stapeln Sie ein C++ STL

Was ist std::stack?

Ein Stapel ist eine Datenstruktur, die auf der LIFO-Technik (Last In First Out) basiert. Der std::stack ermรถglicht das Hinzufรผgen und Entfernen von Elementen nur von einem Ende aus.

Die Klasse `std::stack` ist ein Container-Adapter. Container-Objekte speichern Daten desselben Datentyps. Sie kรถnnen einen Stack aus verschiedenen Sequenz-Containern erstellen. Wird kein Container angegeben, wird standardmรครŸig der Deque-Container verwendet. Container-Adapter unterstรผtzen keine Iteratoren und kรถnnen daher nicht zur Datenmanipulation verwendet werden.

Stack-Syntax

Um einen Stapel zu erstellen, mรผssen wir Folgendes einschlieรŸen Header-Datei in unserem Code. AnschlieรŸend verwenden wir diese Syntax, um den std::stack zu definieren:

template <class Type, class Container = deque<Type> > class stack;
  • Typ โ€“ ist der Typ des Elements im std::stack. Es kann jeder gรผltige C++ Typ oder sogar ein benutzerdefinierter Typ.
  • Container โ€“ ist der Typ des zugrunde liegenden Containerobjekts.

Mitgliedstypen

Hier sind Stack-Mitgliedstypen:

  • Werttypโ€“ Der erste Template-Parameter, T. Er bezeichnet die Elementtypen.
  • Containertypโ€“ Der zweite Template-Parameter, Container. Er bezeichnet den zugrunde liegenden Containertyp.
  • GrรถรŸentypโ€“ Vorzeichenloser Ganzzahltyp.

Operationen im Stack

A C++ Der Stack unterstรผtzt die folgenden grundlegenden Operationen:

  • drรผcken โ€“ Es fรผgt ein Element zum Stapel hinzu/schiebt es hinein.
  • Pop โ€“ Es entfernt ein Element vom Stapel.
  • spรคhen โ€“ Gibt das oberste Element des Stapels zurรผck, ohne es zu entfernen.
  • istVoll โ€“ Prรผft, ob ein Stapel voll ist.
  • ist leer โ€“ Prรผft, ob ein Stapel leer ist.

Stack-Implementierung

Die folgenden Schritte zeigen, wie sich die oberste Position des Stapels verschiebt, wenn Elemente hinzugefรผgt und anschlieรŸend entfernt werden:

Schritt 1) โ€‹โ€‹Wir haben zunรคchst einen leeren Stapel. Das oberste Element eines leeren Stapels wird auf -1 gesetzt.

Schritt 2) Als Nรคchstes haben wir das Element 5 auf den Stapel gelegt. Das oberste Element des Stapels zeigt auf das Element 5.

Schritt 3) Als Nรคchstes haben wir das Element 50 auf den Stapel gelegt. Das oberste Element des Stapels verschiebt sich und zeigt auf das Element 50.

Schritt 4) Wir haben nun eine Pop-Operation durchgefรผhrt und das oberste Element vom Stack entfernt. Element 50 wurde vom Stack entfernt. Das oberste Element des Stacks zeigt nun auf Element 5.

Stack-Implementierung

push() und pop()

Die Funktion `stack::push()` fรผgt ein neues Element oben auf den Stapel hinzu. Die StapelgrรถรŸe wird nach dem Einfรผgen um 1 erhรถht. Die Funktion hat folgende Syntax:

stack.push(value)

Der Wert ist das Element, das in den Stapel eingefรผgt werden soll.

Die Funktion `stack::pop()` entfernt das oberste Element des Stapels. Dies ist das neueste Element im Stapel. Die StapelgrรถรŸe verringert sich nach dem Entfernen um 1. Hier ist die Funktionssyntax:

stack.pop()

Die Funktion benรถtigt keine Parameter.

Beispiel 1:

#include <iostream> 
#include <stack> 
using namespace std;
int main() {
	stack<int> st;
	st.push(10);
	st.push(20);
	st.push(30);
	st.push(40);
	
         st.pop();
	st.pop();

	while (!st.empty()) {
		cout << ' ' << st.top();
		st.pop();
	}
}

Ausgang:

push() und pop()

Hier ist ein Screenshot des Codes:

push() und pop()

Code Erlรคuterung:

  1. Fรผgen Sie die iostream-Header-Datei in unseren Code ein, um ihre Funktionen zu nutzen.
  2. Fรผgen Sie die Stack-Header-Datei in unseren Code ein, um ihre Funktionen zu nutzen.
  3. Fรผgen Sie den std-Namespace in unseren Code ein, um seine Klassen zu verwenden, ohne ihn aufzurufen.
  4. Rufen Sie die Funktion main() auf. Die Programmlogik sollte innerhalb dieser Funktion hinzugefรผgt werden.
  5. Erstellen Sie einen Stack st, um ganzzahlige Werte zu speichern.
  6. Verwenden Sie die Funktion push(), um den Wert 10 in den Stapel einzufรผgen.
  7. Verwenden Sie die Funktion push(), um den Wert 20 in den Stapel einzufรผgen.
  8. Verwenden Sie die Funktion push(), um den Wert 30 in den Stapel einzufรผgen.
  9. Verwenden Sie die Funktion push(), um den Wert 40 in den Stapel einzufรผgen.
  10. Verwenden Sie die Funktion pop(), um das oberste Element aus dem Stapel zu entfernen, also 40. Das oberste Element wird jetzt zu 30.
  11. Verwenden Sie die Funktion pop(), um das oberste Element aus dem Stapel zu entfernen, also 30. Das oberste Element wird jetzt zu 20.
  12. Verwenden Sie eine while-Schleife und die Funktion empty(), um zu prรผfen, ob der Stapel NICHT leer ist. Das ! ist der NICHT-Operator.
  13. Drucken des aktuellen Inhalts des Stapels auf der Konsole.
  14. Rufen Sie die Funktion pop() auf dem Stapel auf.
  15. Ende des Kรถrpers der while-Schleife.
  16. Ende des main()-Funktionskรถrpers.

empty(), size(), top()

Stapel verfรผgen รผber integrierte Funktionen, mit denen Sie mit dem Stapel und seinen Werten experimentieren kรถnnen. Diese beinhalten:

  • leer()โ€“ prรผft, ob ein Stapel leer ist oder nicht.
  • GrรถรŸe()โ€“ gibt die GrรถรŸe des Stapels zurรผck, also die Anzahl der Elemente im Stapel.
  • oben()โ€“ greift auf das oberste Stapelelement zu.

Beispiel 2:

#include <iostream> 
#include <stack>  
using namespace std;
void createStack(stack <int> mystack)
{
	stack <int> ms = mystack;
	while (!ms.empty())
	{
		cout << '\t' << ms.top();
		ms.pop();
	}
	cout << '\n';
}
int main()
{
	stack <int> st;
	st.push(32);
	st.push(21);
	st.push(39);
	st.push(89);
	st.push(25);

	cout << "The stack st is: ";
	createStack(st);
	cout << "\n st.size() : " << st.size();
	cout << "\n st.top() : " << st.top();
	cout << "\n st.pop() : ";
	st.pop();
	createStack(st);
	return 0;
}

Ausgang:

empty(), size(), top()

Hier ist ein Screenshot des Codes:

empty(), size(), top()

Code Erlรคuterung:

  1. Binden Sie die iostream-Header-Datei in unseren Code ein, um deren Funktionen nutzen zu kรถnnen.
  2. Binden Sie die Stack-Header-Datei in unseren Code ein, um deren Funktionen nutzen zu kรถnnen.
  3. Fรผgen Sie den std-Namespace in unser Programm ein, um seine Klassen zu verwenden, ohne ihn aufzurufen.
  4. Erstellen Sie die Funktion createStack, mit der wir den Stack mystack erstellen kรถnnen. Der Stapel enthรคlt eine Reihe von Ganzzahlen.
  5. Der Anfang des Hauptteils der Funktion createStack.
  6. Erstellen Sie eine Instanz des Mystack-Datentyps und geben Sie ihr den Namen ms.
  7. Verwenden Sie die while-Schleife und die Funktion empty(), um zu รผberprรผfen, ob der Stapel leer ist.
  8. Der Anfang des Hauptteils der while-Schleife.
  9. Verwenden Sie die Funktion top(), die oben im Stapel gespeichert ist. Das Zeichen \t erstellt einen neuen Tab.
  10. Verwenden Sie die Funktion pop(), um das Element oben im Stapel zu lรถschen.
  11. Ende des Kรถrpers der while-Schleife.
  12. Drucken Sie eine Leerzeile auf der Konsole.
  13. Ende des Hauptteils der Funktion createStack.
  14. Rufen Sie die Funktion main() auf. Die Programmlogik sollte im Hauptteil der Funktion main() hinzugefรผgt werden.
  15. Der Beginn des Hauptteils der Funktion main().
  16. Erstellen Sie ein Stapelobjekt st.
  17. Verwenden Sie die Funktion push(), um das Element 32 in den Stapel einzufรผgen.
  18. Verwenden Sie die Funktion push(), um das Element 21 in den Stapel einzufรผgen.
  19. Verwenden Sie die Funktion push(), um das Element 39 in den Stapel einzufรผgen.
  20. Verwenden Sie die Funktion push(), um das Element 89 in den Stapel einzufรผgen.
  21. Verwenden Sie die Funktion push(), um das Element 25 in den Stapel einzufรผgen.
  22. Drucken Sie einen Text auf der Konsole.
  23. Rufen Sie die Funktion โ€žcreateStackโ€œ auf, um die oben genannten Einfรผgevorgรคnge im Stapel auszufรผhren.
  24. Drucken Sie die GrรถรŸe des Stapels zusammen mit anderem Text auf der Konsole aus.
  25. Drucken Sie das Element oben im Stapel auf der Konsole.
  26. Drucken Sie einen Text auf der Konsole.
  27. Lรถschen Sie das Element oben im Stapel. AnschlieรŸend werden die im Stapel verbleibenden Elemente zurรผckgegeben.
  28. Rufen Sie die Funktion โ€žcreateStackโ€œ auf, um die oben genannten Vorgรคnge auszufรผhren.
  29. Das Programm muss bei erfolgreichem Abschluss einen Wert zurรผckgeben.
  30. Ende des Hauptteils der Funktion main().

emplace() und swap()

Dies sind weitere integrierte Stack-Funktionen:

  • emplace()โ€“ konstruiert und fรผgt dann ein neues Element oben auf den Stapel ein.
  • tauschen()โ€“ tauscht den Inhalt eines Stapels mit dem Inhalt eines anderen Stapels aus.

Beispiel 3:

#include <iostream>    
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st1;
	stack<int> st2;

	st1.emplace(12);
	st1.emplace(19);

	st2.emplace(20);
	st2.emplace(23);

	st1.swap(st2);

	cout << "st1 = ";
	while (!st1.empty()) {
		cout << st1.top() << " ";
		st1.pop();
	}

	cout << endl << "st2 = ";
	while (!st2.empty()) {
		cout << st2.top() << " ";
		st2.pop();
	}
}

Ausgang:

emplace() und swap()

Hier ist ein Screenshot des Codes:

emplace() und swap()

Code Erlรคuterung:

  1. Fรผgen Sie die iostream-Header-Datei in unseren Code ein, um ihre Funktionen zu nutzen.
  2. Fรผgen Sie die Stack-Header-Datei in unseren Code ein, um ihre Funktionen zu nutzen.
  3. Fรผgen Sie die cstdlib-Header-Datei in unseren Code ein, um ihre Funktionen zu nutzen.
  4. Fรผgen Sie den std-Namespace in unseren Code ein, um seine Klassen zu verwenden, ohne ihn aufzurufen.
  5. Rufen Sie die Funktion main() auf. Die Programmlogik wird im Hauptteil dieser Funktion hinzugefรผgt.
  6. Deklarieren Sie einen Stack mit dem Namen st1, um ganzzahlige Werte zu speichern.
  7. Deklarieren Sie einen Stack mit dem Namen st2, um ganzzahlige Werte zu speichern.
  8. Verwenden Sie die Funktion emplace(), um die Ganzzahl 12 in den Stapel mit dem Namen st1 einzufรผgen.
  9. Verwenden Sie die Funktion emplace(), um die Ganzzahl 19 in den Stapel mit dem Namen st1 einzufรผgen.
  10. Verwenden Sie die Funktion emplace(), um die Ganzzahl 20 in den Stapel mit dem Namen st2 einzufรผgen.
  11. Verwenden Sie die Funktion emplace(), um die Ganzzahl 23 in den Stapel mit dem Namen st2 einzufรผgen.
  12. Verwenden Sie die Funktion swap(), um den Inhalt der beiden Stapel st1 und st2 auszutauschen. Der Inhalt des Stacks st1 soll auf den Stack st2 verschoben werden. Der Inhalt des Stacks st2 soll auf den Stack st1 verschoben werden.
  13. Drucken Sie einen Text auf der Konsole.
  14. Verwenden Sie die while-Anweisung und die Funktion empty(), um zu prรผfen, ob der Stack st1 nicht leer ist.
  15. Drucken Sie den Inhalt des Stacks st1 auf der Konsole. Das โ€ž โ€œ fรผgt beim Drucken auf der Konsole Platz zwischen den Stapelelementen hinzu.
  16. Fรผhren Sie die Funktion pop() auf dem Stapel st1 aus, um das oberste Element zu entfernen.
  17. Ende des Hauptteils der while-Anweisung.
  18. Drucken Sie einen Text auf der Konsole. Das Endl ist ein C++ Schlรผsselwort fรผr Zeilenende. Es bewegt den Mauszeiger zur nรคchsten Zeile, um dort mit dem Drucken zu beginnen.
  19. Verwenden Sie die while-Anweisung und die Funktion empty(), um zu prรผfen, ob der Stack st2 nicht leer ist.
  20. Drucken Sie den Inhalt des Stacks st2 auf der Konsole. Das โ€ž โ€œ fรผgt beim Drucken auf der Konsole Platz zwischen den Stapelelementen hinzu.
  21. Fรผhren Sie die Funktion pop() auf dem Stapel st2 aus, um das oberste Element zu entfernen.
  22. Ende des Hauptteils der while-Anweisung.
  23. Ende des Hauptteils der main()-Funktion.

Stapeln Sie in STL

Die STL (Standard Template Library) enthรคlt Vorlagenklassen, die allgemeine C++ Datenstrukturen. Daher kann ein Stack auch in STL implementiert werden. Wir binden diese Bibliothek einfach in unseren Code ein und verwenden sie, um einen Stack zu definieren.

stack<T> st; 

Die obige Syntax deklariert einen Stapel st fรผr Elemente des Datentyps T.

Beispiel 4:

#include <iostream>      
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st;
	st.push(12);
	st.push(19);
	st.push(20);
	cout << st.top();   
	cout << st.size();  
}

Ausgang:

Stapeln Sie in STL

Hier ist ein Screenshot des Codes:

Stapeln Sie in STL

Code Erlรคuterung:

  1. Fรผgen Sie die iostream-Header-Datei in unseren Code ein, um ihre Funktionen zu nutzen.
  2. Fรผgen Sie die Stack-Header-Datei in unseren Code ein, um ihre Funktionen zu nutzen.
  3. Fรผgen Sie die cstdlib-Header-Datei in unseren Code ein, um ihre Funktionen zu nutzen.
  4. Fรผgen Sie den std-Namespace in unseren Code ein, um seine Klassen zu verwenden, ohne ihn aufzurufen.
  5. Rufen Sie die Funktion main() auf. Die Programmlogik sollte im Hauptteil dieser Funktion hinzugefรผgt werden.
  6. Deklarieren Sie einen Stack st, um ganzzahlige Daten zu speichern.
  7. Fรผgen Sie das Element 12 zum Stapel hinzu.
  8. Fรผgen Sie das Element 19 zum Stapel hinzu.
  9. Fรผgen Sie das Element 20 zum Stapel hinzu.
  10. Drucken Sie das Element oben im Stapel auf der Konsole.
  11. Drucken Sie die GrรถรŸe des Stapels auf der Konsole aus.
  12. Ende des Hauptteils der Funktion main().

Hรคufig gestellte Fragen

Ein Stapel folgt dem LIFO-Prinzip (Last In First Out), entfernt also zuerst das neueste Element. Eine Warteschlange folgt dem FIFO-Prinzip (First In First Out) und entfernt zuerst das รคlteste Element. Beide eignen sich fรผr unterschiedliche Verarbeitungsanforderungen.

Ja. std::stack akzeptiert jeden Sequenzcontainer als zweites Template-Argument, wie zum Beispiel std::stack. Die Standard-Deque eignet sich fรผr die meisten Fรคlle, wรคhrend Vektoren die Speicherlokalitรคt verbessern kรถnnen, wenn der Stack vorhersehbar wรคchst.

Sowohl Push- als auch Pop-Operationen laufen in konstanter O(1)-Zeit, da der Stack nur sein oberstes Element berรผhrt. Die zugrundeliegende Deque fรผgt Elemente hinzu, ohne bereits vorhandene zu verschieben, sodass die Performance unabhรคngig von der StackgrรถรŸe vorhersehbar bleibt.

Der `std::stack` stellt keine Iteratoren bereit, daher lรคsst sich eine bereichsbasierte Schleife nicht kompilieren. Um alle Werte zu lesen, kopieren Sie den Stack und rufen Sie wiederholt `top()` und `pop()` auf der Kopie auf. Alternativ kรถnnen Sie eine Deque verwenden, wenn eine Traversierung erforderlich ist.

Die Funktion `pop()` gibt absichtlich `void` zurรผck, um das Entfernen von Daten vom Zugriff zu trennen und so Ausnahmen zu vermeiden. Lesen und Entfernen in einem Schritt kรถnnten zu Datenverlust fรผhren, falls beim Kopieren ein Fehler auftritt. Daher rufen Sie zuerst `top()` und anschlieรŸend `pop()` auf.

Nein. Der `std::stack` bietet keine integrierte Synchronisierung, daher fรผhren gleichzeitige `push`- und `pop`-Aufrufe von mehreren Threads zu Datenkonflikten. Schรผtzen Sie den gemeinsamen Zugriff mit einem Mutex oder einem anderen Sperrmechanismus, bevor Sie einen gemeinsamen Stack fรผr mehrere Threads verwenden.

Ja. KI-Programmierassistenten lesen einen Kommentar oder Funktionsnamen und erzeugen std::stack-Deklarationen, Push- und Pop-Schleifen sowie Traversierungslogik. RevDas Betrachten der generierten Grenzwertprรผfungen, wie z. B. empty()-Tests vor pop(), bleibt wichtig fรผr sichere Programme.

Ja. GitHub-Copilot Vervollstรคndigt die Aufrufe von push, pop, top und empty() wรคhrend der Eingabe und schlรคgt Containeroptionen vor. Es ist 2026. C++ Code Intelligence erweitert die Symbolerkennung, sodass die Vorschlรคge fรผr Multi-File-Stacks konsistent bleiben.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: