Stables ind C++ STL med Eksempel

โšก Smart opsummering

Stables ind C++ STL implementerer en LIFO-containeradapter, der tilfรธjer og fjerner elementer fra en enkelt ende, wrapping en underliggende sekvensbeholder sรฅsom deque, vector eller list til at administrere ordnede data.

  • ๐Ÿ”˜ LIFO-princippet: std::stack fรธlger rรฆkkefรธlgen "Last In First Out", sรฅ det element, der senest blev flyttet, er altid det fรธrste, der fjernes.
  • ๐Ÿ“ฆ Beholderadapter: En stak ombryder en eksisterende sekvenscontainer og bruger som standard deque, nรฅr der ikke angives nogen containertype.
  • โž• Kerneoperationer: Funktionerne push, pop og top indsรฆtter henholdsvis et element, fjerner det รธverste element og lรฆser det รธverste element.
  • ๐Ÿ” Statslige checks: Funktionerne empty og size rapporterer, om stakken indeholder elementer, og hvor mange den i รธjeblikket gemmer.
  • ๐Ÿ” Ekstra funktioner: Funktionerne emplace og swap bygger et element pรฅ plads og udveksler indholdet af to stakke.
  • ๐Ÿค– AI assistance: AI-kodningsassistenter som GitHub Copilot genererer stack push, pop og traversal boilerplate ud fra en kort kommentar.

Stables ind C++ STL

Hvad er std::stack?

En stak er en datastruktur, der fungerer baseret pรฅ LIFO (Last In First Out) teknik. Std::-stakken tillader kun at tilfรธje og fjerne elementer fra den ene ende.

std::stack-klassen er en containeradapter. Containerobjekter indeholder data af en lignende datatype. Du kan oprette en stak fra forskellige sekvenscontainere. Hvis der ikke angives en container, bruges deque-containeren som standard. Containeradaptere understรธtter ikke iteratorer, sรฅ de kan ikke bruges til at manipulere data.

Staksyntaks

For at oprette en stak skal vi inkludere header-fil i vores kode. Vi bruger derefter denne syntaks til at definere std::stack:

template <class Type, class Container = deque<Type> > class stack;
  • Type โ€“ er den type element, der er indeholdt i std::stakken. Det kan vรฆre enhver gyldig C++ type eller endda en brugerdefineret type.
  • Container โ€“ er typen af โ€‹โ€‹underliggende containerobjekt.

Medlemstyper

Her er stackmedlemstyper:

  • vรฆrditypeโ€“ Den fรธrste skabelonparameter, T. Den angiver elementtyperne.
  • containertypeโ€“ Den anden skabelonparameter, Container. Den angiver den underliggende containertype.
  • stรธrrelsestypeโ€“ Usigneret integraltype.

Operationer i Stack

A C++ stack understรธtter fรธlgende grundlรฆggende handlinger:

  • skub โ€“ Den tilfรธjer/skubber et element ind i stakken.
  • pop โ€“ Den fjerner/popper en genstand ud af stakken.
  • peek โ€“ Returnerer det รธverste element i stakken uden at fjerne det.
  • erFuld โ€“ Kontrollerer om en stak er fuld.
  • er tom โ€“ Kontrollerer om en stak er tom.

Stakimplementering

De fรธlgende trin viser, hvordan toppen af โ€‹โ€‹stakken forskydes, nรฅr genstande skubbes og derefter poppes op:

Trin 1) Vi har oprindeligt en tom stak. Toppen af โ€‹โ€‹en tom stak sรฆttes til -1.

Trin 2) Dernรฆst har vi skubbet element 5 ind i stakken. Toppen af โ€‹โ€‹stakken vil pege mod element 5.

Trin 3) Dernรฆst har vi skubbet element 50 ind i stakken. Toppen af โ€‹โ€‹stakken forskydes og peger mod element 50.

Trin 4) Vi har derefter udfรธrt en pop-operation, hvor vi fjerner det รธverste element fra stakken. Element 50 poppes ud af stakken. Toppen af โ€‹โ€‹stakken peger nu pรฅ element 5.

Stakimplementering

push() og pop()

Funktionen stack::push() tilfรธjer et nyt element รธverst i stakken. Stรธrrelsen pรฅ stakken รธges med 1 efter indsรฆttelsen. Funktionen bruger denne syntaks:

stack.push(value)

Vรฆrdien er det element, der skal indsรฆttes i stakken.

Funktionen stack::pop() fjerner det รธverste element i stakken. Dette er det nyeste element i stakken. Stรธrrelsen pรฅ stakken reduceres med 1 efter fjernelsen. Her er funktionens syntaks:

stack.pop()

Funktionen tager ingen parametre.

Eksempel 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();
	}
}

Output:

push() og pop()

Her er et skรฆrmbillede af koden:

push() og pop()

Code Forklaring:

  1. Inkluder iostream-headerfilen i vores kode for at bruge dens funktioner.
  2. Inkluder stackheader-filen i vores kode for at bruge dens funktioner.
  3. Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
  4. Kald funktionen main(). Programlogikken skal tilfรธjes i denne funktion.
  5. Opret en stak st for at gemme heltalsvรฆrdier.
  6. Brug push()-funktionen til at indsรฆtte vรฆrdien 10 i stakken.
  7. Brug push()-funktionen til at indsรฆtte vรฆrdien 20 i stakken.
  8. Brug push()-funktionen til at indsรฆtte vรฆrdien 30 i stakken.
  9. Brug push()-funktionen til at indsรฆtte vรฆrdien 40 i stakken.
  10. Brug pop()-funktionen til at fjerne det รธverste element fra stakken, det vil sige 40. Det รธverste element bliver nu 30.
  11. Brug pop()-funktionen til at fjerne det รธverste element fra stakken, det vil sige 30. Det รธverste element bliver nu 20.
  12. Brug en while-lรธkke og en tomme()-funktion til at kontrollere, om stakken IKKE er tom. Den ! er NOT-operatรธren.
  13. Udskrivning af det aktuelle indhold af stakken pรฅ konsollen.
  14. Kald pop()-funktionen pรฅ stakken.
  15. Slut pรฅ mens-lรธkkens krop.
  16. Slutningen af โ€‹โ€‹hoved() funktionsteksten.

tomme(), stรธrrelse(), top()

Stakke har indbyggede funktioner, som du kan bruge til at lege med stakken og dens vรฆrdier. Disse omfatter:

  • tom()โ€“ kontrollerer om en stak er tom eller ej.
  • stรธrrelse()โ€“ returnerer stรธrrelsen af โ€‹โ€‹stakken, det vil sige antallet af elementer i en stak.
  • top()โ€“ tilgรฅr stakelementet รธverst.

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

Output:

tomme(), stรธrrelse(), top()

Her er et skรฆrmbillede af koden:

tomme(), stรธrrelse(), top()

Code Forklaring:

  1. Inkluder iostream-headerfilen i vores kode for at bruge dens funktioner.
  2. Inkluder stackheader-filen i vores kode for at bruge dens funktioner.
  3. Inkluder std-navneomrรฅdet i vores program for at bruge dets klasser uden at kalde det.
  4. Opret funktionen createStack, som vi kan bruge til at oprette stack mystack. Stakken vil indeholde et sรฆt heltal.
  5. Begyndelsen af โ€‹โ€‹kroppen af โ€‹โ€‹createStack-funktionen.
  6. Opret en forekomst af mystack-datatypen og giv den navnet ms.
  7. Brug while-lรธkken og funktionen empty() til at kontrollere, om stakken er tom.
  8. Starten pรฅ kroppen af โ€‹โ€‹while-lรธkken.
  9. Brug top()-funktionen, der er gemt รธverst i stakken. Tegnet \t vil oprette en ny fane.
  10. Brug pop()-funktionen til at slette elementet รธverst i stakken.
  11. Slut pรฅ mens-lรธkkens krop.
  12. Udskriv en tom linje pรฅ konsollen.
  13. Slutningen af โ€‹โ€‹brรธdteksten af โ€‹โ€‹createStack-funktionen.
  14. Kald funktionen main(). Programlogikken skal tilfรธjes i hoveddelen af โ€‹โ€‹funktionen main().
  15. Starten af โ€‹โ€‹kroppen af โ€‹โ€‹funktion main().
  16. Opret et stabelobjekt st.
  17. Brug push()-funktionen til at indsรฆtte elementet 32 โ€‹โ€‹i stakken.
  18. Brug push()-funktionen til at indsรฆtte elementet 21 โ€‹โ€‹i stakken.
  19. Brug push()-funktionen til at indsรฆtte elementet 39 โ€‹โ€‹i stakken.
  20. Brug push()-funktionen til at indsรฆtte elementet 89 โ€‹โ€‹i stakken.
  21. Brug push()-funktionen til at indsรฆtte elementet 25 โ€‹โ€‹i stakken.
  22. Udskriv noget tekst pรฅ konsollen.
  23. Kald createStack-funktionen for at udfรธre ovenstรฅende indsรฆttelsesoperationer i stakken.
  24. Udskriv stรธrrelsen af โ€‹โ€‹stakken pรฅ konsollen sammen med anden tekst.
  25. Udskriv elementet รธverst i stakken pรฅ konsollen.
  26. Udskriv noget tekst pรฅ konsollen.
  27. Slet elementet รธverst i stakken. Det vil derefter returnere de resterende elementer i stakken.
  28. Kald createStack-funktionen for at udfรธre ovenstรฅende operationer.
  29. Programmet skal returnere vรฆrdi efter vellykket afslutning.
  30. Slutningen af โ€‹โ€‹hoveddelen af โ€‹โ€‹funktion main().

emplace() og swap()

Disse er andre indbyggede stakfunktioner:

  • indsรฆtte()โ€“ konstruerer og indsรฆtter derefter et nyt element รธverst i stakken.
  • bytte()โ€“ udveksler stakindholdet med en anden staks indhold.

Eksempel 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();
	}
}

Output:

emplace() og swap()

Her er et skรฆrmbillede af koden:

emplace() og swap()

Code Forklaring:

  1. Inkluder iostream-headerfilen i vores kode for at bruge dens funktioner.
  2. Inkluder stackheader-filen i vores kode for at bruge dens funktioner.
  3. Inkluder cstdlib-headerfilen i vores kode for at bruge dens funktioner.
  4. Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
  5. Kald funktionen main(). Programlogikken vil blive tilfรธjet i denne funktions brรธdtekst.
  6. Erklรฆre en stak ved navn st1 for at gemme heltalsvรฆrdier.
  7. Erklรฆre en stak ved navn st2 for at gemme heltalsvรฆrdier.
  8. Brug emplace()-funktionen til at indsรฆtte hele tallet 12 i stakken med navnet st1.
  9. Brug emplace()-funktionen til at indsรฆtte hele tallet 19 i stakken med navnet st1.
  10. Brug emplace()-funktionen til at indsรฆtte hele tallet 20 i stakken med navnet st2.
  11. Brug emplace()-funktionen til at indsรฆtte hele tallet 23 i stakken med navnet st2.
  12. Brug swap()-funktionen til at bytte indholdet af de to stakke, st1 og st2. Indholdet af stakken st1 skal flyttes til stakken st2. Indholdet af stakken st2 skal flyttes til stakken st1.
  13. Udskriv noget tekst pรฅ konsollen.
  14. Brug while-sรฆtningen og funktionen empty() til at kontrollere, om stakken st1 ikke er tom.
  15. Udskriv indholdet af stakken st1 pรฅ konsollen. " " tilfรธjer plads mellem stakelementerne, nรฅr de udskrives pรฅ konsollen.
  16. Udfรธr pop()-funktionen pรฅ stakken st1 for at fjerne det รธverste element.
  17. Slutningen af โ€‹โ€‹brรธdteksten af โ€‹โ€‹while-erklรฆringen.
  18. Udskriv noget tekst pรฅ konsollen. Endl er en C++ nรธgleord for slutlinje. Den flytter musemarkรธren til nรฆste linje for at begynde udskrivningen derfra.
  19. Brug while-sรฆtningen og funktionen empty() til at kontrollere, om stakken st2 ikke er tom.
  20. Udskriv indholdet af stakken st2 pรฅ konsollen. " " tilfรธjer plads mellem stakelementerne, nรฅr de udskrives pรฅ konsollen.
  21. Udfรธr pop()-funktionen pรฅ stakken st2 for at fjerne det รธverste element.
  22. Slutningen af โ€‹โ€‹brรธdteksten af โ€‹โ€‹while-erklรฆringen.
  23. Slutningen af โ€‹โ€‹hoveddelen af โ€‹โ€‹funktionen main().

Stak i STL

STL (Standard Template Library) kommer med skabelonklasser, der giver fรฆlles C++ datastrukturer. Derfor kan en stack ogsรฅ implementeres i STL. Vi inkluderer simpelthen dette bibliotek i vores kode og bruger det til at definere en stak.

stack<T> st; 

Ovenstรฅende syntaks erklรฆrer en stack st til elementer af datatype T.

Eksempel 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();  
}

Output:

Stak i STL

Her er et skรฆrmbillede af koden:

Stak i STL

Code Forklaring:

  1. Inkluder iostream-headerfilen i vores kode for at bruge dens funktioner.
  2. Inkluder stackheader-filen i vores kode for at bruge dens funktioner.
  3. Inkluder cstdlib-headerfilen i vores kode for at bruge dens funktioner.
  4. Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
  5. Kald funktionen main(). Programlogikken skal tilfรธjes i denne funktions brรธdtekst.
  6. Erklรฆre en stak st for at gemme heltalsdata.
  7. Tilfรธj element 12 til stakken.
  8. Tilfรธj element 19 til stakken.
  9. Tilfรธj element 20 til stakken.
  10. Udskriv elementet รธverst i stakken pรฅ konsollen.
  11. Udskriv stakkens stรธrrelse pรฅ konsollen.
  12. Slutningen af โ€‹โ€‹kroppen af โ€‹โ€‹funktionen main().

Ofte Stillede Spรธrgsmรฅl

En stak fรธlger rรฆkkefรธlgen "sidst ind, fรธrst ud", sรฅ den fjerner det nyeste element fรธrst. En kรธ fรธlger rรฆkkefรธlgen "fรธrst ind, fรธrst ud", hvor det รฆldste element fjernes fรธrst. Hver af dem opfylder forskellige behandlingsbehov.

Ja. std::stack accepterer enhver sekvenscontainer som sit andet skabelonargument, sรฅsom std::stack >. Standarddequen passer til de fleste tilfรฆlde, mens vector kan forbedre hukommelseslokaliteten, nรฅr stakken vokser forudsigeligt.

Bรฅde push og pop kรธrer i konstant O(1) tid, fordi stakken kun rรธrer sit รธverste element. Den underliggende deque tilfรธjer elementer uden at flytte eksisterende, sรฅ ydeevnen forbliver forudsigelig uanset stakkens stรธrrelse.

std::stacken eksponerer ingen iteratorer, sรฅ et rรฆkkeviddebaseret loop vil ikke kompilere. For at lรฆse hver vรฆrdi skal du kopiere stakken og gentagne gange kalde top() og pop() pรฅ kopien, eller vรฆlge en deque (deque), nรฅr traversal er pรฅkrรฆvet.

Funktionen pop() returnerer void som standard, og adskiller fjernelse fra adgang for at sikre undtagelser. Lรฆsning og fjernelse i รฉt trin kan medfรธre tab af data, hvis kopiering giver en fejl, sรฅ du kalder top() fรธrst og derefter pop().

Nej. std::stacken tilbyder ingen indbygget synkronisering, sรฅ samtidige push- og pop-kald fra flere trรฅde forรฅrsager datakaplรธb. Beskyt delt adgang med en mutex eller en anden lรฅsemekanisme, fรธr du bruger รฉn stak pรฅ tvรฆrs af trรฅde.

Ja. AI-kodningsassistenter lรฆser en kommentar eller et funktionsnavn og producerer std::stack-deklarationer, push- og pop-loops og traversallogik. RevVisning af de genererede grรฆnsekontroller, sรฅsom empty() tests fรธr pop(), er fortsat vigtig for sikre programmer.

Ja. GitHub Copilot fuldfรธrer push-, pop-, top- og empty()-kald, mens du skriver, og foreslรฅr containervalg. Det er 2026. C++ Kodeintelligens tilfรธjer symbolbevidsthed, sรฅ forslag til stak af flere filer forbliver konsistente.

Opsummer dette indlรฆg med: