Stable inn C++ STL med Eksempel

โšก Smart oppsummering

Stable inn C++ STL implementerer en LIFO-containeradapter som legger til og fjerner elementer fra en enkelt ende, innpakningping en underliggende sekvensbeholder som deque, vektor eller liste for รฅ administrere ordnede data.

  • ๐Ÿ”˜ LIFO-prinsippet: std::stack fรธlger rekkefรธlgen ยซsist inn, fรธrst utยป, sรฅ det sist flyttede elementet er alltid det fรธrste som fjernes.
  • ๐Ÿ“ฆ Beholderadapter: En stakk pakker inn en eksisterende sekvenscontainer og bruker som standard deque nรฅr ingen containertype er oppgitt.
  • โž• Kjernedrift: Funksjonene push, pop og top setter inn et element, fjerner det รธverste elementet og leser det รธverste elementet.
  • ๐Ÿ” Statlige sjekker: Funksjonene empty og size rapporterer om stakken inneholder elementer og hvor mange den lagrer for รธyeblikket.
  • ๐Ÿ” Ekstra funksjoner: Funksjonene emplace og swap bygger et element pรฅ plass og utveksler innholdet i to stabler.
  • ๐Ÿค– AI-hjelp: AI-kodingsassistenter som GitHub Copilot genererer standardtekst for stakk-push, pop og traversal fra en kort kommentar.

Stable inn C++ STL

Hva er std::stack?

En stack er en datastruktur som opererer basert pรฅ LIFO (Last In First Out) teknikk. Std::-stakken lar elementer legges til og fjernes kun fra den ene enden.

std::stack-klassen er en containeradapter. Containerobjekter inneholder data av en lignende datatype. Du kan opprette en stakk fra forskjellige sekvenscontainere. Hvis ingen container er oppgitt, vil deque-containeren brukes som standard. Containeradaptere stรธtter ikke iteratorer, sรฅ de kan ikke brukes til รฅ manipulere data.

Stabelsyntaks

For รฅ lage en stabel mรฅ vi inkludere header-fil i koden vรฅr. Vi bruker deretter denne syntaksen til รฅ definere std::stack:

template <class Type, class Container = deque<Type> > class stack;
  • typen โ€“ er typen element som finnes i std::-stakken. Den kan vรฆre hvilken som helst gyldig C++ type eller til og med en brukerdefinert type.
  • Container โ€“ er typen underliggende beholderobjekt.

Medlemstyper

Her er stabelmedlemstyper:

  • verditypeโ€“ Den fรธrste malparameteren, T. Den angir elementtypene.
  • beholdertypeโ€“ Den andre malparameteren, Container. Den angir den underliggende containertypen.
  • stรธrrelsestypeโ€“ Usignert integraltype.

Operasjoner i Stack

A C++ stack stรธtter fรธlgende grunnleggende operasjoner:

  • skyv โ€“ Den legger til/skyver et element i stabelen.
  • pop โ€“ Den fjerner/popper opp et element fra stabelen.
  • titt โ€“ Returnerer det รธverste elementet i stabelen uten รฅ fjerne det.
  • er Full โ€“ Sjekker om en stabel er full.
  • er tom โ€“ Sjekker om en stabel er tom.

Stackimplementering

Fรธlgende trinn viser hvordan toppen av stabelen forskyves nรฅr elementer skyves og deretter poppes:

Trinn 1) Vi har i utgangspunktet en tom stabel. Toppen av en tom stabel settes til -1.

Trinn 2) Deretter har vi dyttet element 5 inn i stakken. Toppen av stakken vil peke mot element 5.

Trinn 3) Deretter har vi dyttet element 50 inn i stakken. Toppen av stakken forskyves og peker mot element 50.

Trinn 4) Vi har deretter utfรธrt en pop-operasjon, der vi fjerner det รธverste elementet fra stakken. Element 50 poppes ut av stakken. Toppen av stakken peker nรฅ mot element 5.

Stackimplementering

push() og pop()

Funksjonen stack::push() legger til et nytt element รธverst i stakken. Stรธrrelsen pรฅ stakken รธkes med 1 etter innsettingen. Funksjonen bruker denne syntaksen:

stack.push(value)

Verdien er elementet som skal settes inn i stabelen.

Funksjonen stack::pop() fjerner det รธverste elementet i stakken. Dette er det nyeste elementet i stakken. Stรธrrelsen pรฅ stakken reduseres med 1 etter fjerningen. Her er funksjonens syntaks:

stack.pop()

Funksjonen tar ingen parametere.

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

Utgang:

push() og pop()

Her er et skjermbilde av koden:

push() og pop()

Code Forklaring:

  1. Inkluder iostream-headerfilen i koden vรฅr for รฅ bruke funksjonene.
  2. Inkluder stabelhodefilen i koden vรฅr for รฅ bruke funksjonene.
  3. Inkluder std-navneomrรฅdet i koden vรฅr for รฅ bruke klassene uten รฅ kalle det.
  4. Kalle hoved()-funksjonen. Programlogikken bรธr legges til i denne funksjonen.
  5. Lag en stabel for รฅ lagre heltallsverdier.
  6. Bruk push()-funksjonen for รฅ sette inn verdien 10 i stabelen.
  7. Bruk push()-funksjonen for รฅ sette inn verdien 20 i stabelen.
  8. Bruk push()-funksjonen for รฅ sette inn verdien 30 i stabelen.
  9. Bruk push()-funksjonen for รฅ sette inn verdien 40 i stabelen.
  10. Bruk pop()-funksjonen for รฅ fjerne toppelementet fra stabelen, det vil si 40. Toppelementet blir nรฅ 30.
  11. Bruk pop()-funksjonen for รฅ fjerne toppelementet fra stabelen, det vil si 30. Toppelementet blir nรฅ 20.
  12. Bruk en while loop og empty() funksjon for รฅ sjekke om stabelen IKKE er tom. Den ! er NOT-operatรธren.
  13. Skriver ut gjeldende innhold i stabelen pรฅ konsollen.
  14. Kall opp pop()-funksjonen pรฅ stabelen.
  15. Slutten av kroppen av while-lรธkken.
  16. Slutten av hoved()-funksjonens hoveddel.

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

Stabler har innebygde funksjoner som du kan bruke til รฅ leke med stabelen og dens verdier. Disse inkluderer:

  • tรธmme()โ€“ sjekker om en stabel er tom eller ikke.
  • stรธrrelse()โ€“ returnerer stรธrrelsen pรฅ stakken, det vil si antall elementer i en stabel.
  • topp()โ€“ รฅpner stakkelementet รธ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;
}

Utgang:

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

Her er et skjermbilde av koden:

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

Code Forklaring:

  1. Inkluder iostream-headerfilen i koden vรฅr for รฅ bruke funksjonene.
  2. Inkluder stabelhodefilen i koden vรฅr for รฅ bruke funksjonene.
  3. Inkluder std-navneomrรฅdet i programmet vรฅrt for รฅ bruke klassene uten รฅ kalle det.
  4. Lag funksjonen createStack som vi kan bruke til รฅ lage stack mystack. Stabelen vil inneholde et sett med heltall.
  5. Begynnelsen av kroppen til createStack-funksjonen.
  6. Opprett en forekomst av mystack-datatypen og gi den navnet ms.
  7. Bruk while-lรธkken og empty()-funksjonen for รฅ sjekke om stabelen er tom.
  8. Starten pรฅ kroppen til while-lรธkken.
  9. Bruk top()-funksjonen som er lagret pรฅ toppen av stabelen. Tegnet \t vil lage en ny fane.
  10. Bruk pop()-funksjonen for รฅ slette elementet รธverst i stabelen.
  11. Slutten av kroppen av while-lรธkken.
  12. Skriv ut en tom linje pรฅ konsollen.
  13. Slutten av brรธdteksten til createStack-funksjonen.
  14. Kalle hoved()-funksjonen. Programlogikken skal legges til i hoveddelen av hoved()-funksjonen.
  15. Starten pรฅ hoveddelen av funksjonen main().
  16. Lag et stabelobjekt st.
  17. Bruk push()-funksjonen for รฅ sette inn elementet 32 โ€‹โ€‹i stabelen.
  18. Bruk push()-funksjonen for รฅ sette inn elementet 21 โ€‹โ€‹i stabelen.
  19. Bruk push()-funksjonen for รฅ sette inn elementet 39 โ€‹โ€‹i stabelen.
  20. Bruk push()-funksjonen for รฅ sette inn elementet 89 โ€‹โ€‹i stabelen.
  21. Bruk push()-funksjonen for รฅ sette inn elementet 25 โ€‹โ€‹i stabelen.
  22. Skriv ut litt tekst pรฅ konsollen.
  23. Kall createStack-funksjonen for รฅ utfรธre innsettingsoperasjonene ovenfor i stabelen.
  24. Skriv ut stรธrrelsen pรฅ stabelen pรฅ konsollen sammen med annen tekst.
  25. Skriv ut elementet pรฅ toppen av stabelen pรฅ konsollen.
  26. Skriv ut litt tekst pรฅ konsollen.
  27. Slett elementet pรฅ toppen av stabelen. Den vil da returnere elementene som er igjen i stabelen.
  28. Kall createStack-funksjonen for รฅ utfรธre operasjonene ovenfor.
  29. Programmet mรฅ returnere verdi ved vellykket gjennomfรธring.
  30. Slutten av hoveddelen av funksjonen main().

emplace() og swap()

Dette er andre innebygde stabelfunksjoner:

  • plassere()โ€“ konstruerer og setter deretter inn et nytt element รธverst i stakken.
  • bytte()โ€“ utveksler stabelinnhold med innholdet i en annen stabel.

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

Utgang:

emplace() og swap()

Her er et skjermbilde av koden:

emplace() og swap()

Code Forklaring:

  1. Inkluder iostream-headerfilen i koden vรฅr for รฅ bruke funksjonene.
  2. Inkluder stabelhodefilen i koden vรฅr for รฅ bruke funksjonene.
  3. Inkluder cstdlib-headerfilen i koden vรฅr for รฅ bruke funksjonene.
  4. Inkluder std-navneomrรฅdet i koden vรฅr for รฅ bruke klassene uten รฅ kalle det.
  5. Kalle hoved()-funksjonen. Programlogikken vil bli lagt til i hoveddelen av denne funksjonen.
  6. Deklarer en stabel som heter st1 for รฅ lagre heltallsverdier.
  7. Deklarer en stabel som heter st2 for รฅ lagre heltallsverdier.
  8. Bruk emplace()-funksjonen til รฅ sette inn hele tallet 12 i stabelen som heter st1.
  9. Bruk emplace()-funksjonen til รฅ sette inn hele tallet 19 i stabelen som heter st1.
  10. Bruk emplace()-funksjonen til รฅ sette inn hele tallet 20 i stabelen som heter st2.
  11. Bruk emplace()-funksjonen til รฅ sette inn hele tallet 23 i stabelen som heter st2.
  12. Bruk swap()-funksjonen til รฅ bytte innholdet i de to stablene, st1 og st2. Innholdet i stabelen st1 skal flyttes til stabelen st2. Innholdet i stabelen st2 skal flyttes til stabelen st1.
  13. Skriv ut litt tekst pรฅ konsollen.
  14. Bruk while-setningen og funksjonen empty() for รฅ sjekke om stabelen st1 ikke er tom.
  15. Skriv ut innholdet i stabelen st1 pรฅ konsollen. " " legger til mellomrom mellom stabelelementene nรฅr de skrives ut pรฅ konsollen.
  16. Utfรธr pop()-funksjonen pรฅ stabelen st1 for รฅ fjerne toppelementet.
  17. Slutten av brรธdteksten til while-utsagnet.
  18. Skriv ut litt tekst pรฅ konsollen. Endl er en C++ nรธkkelord for sluttlinje. Den flytter musepekeren til neste linje for รฅ begynne utskriften derfra.
  19. Bruk while-setningen og funksjonen empty() for รฅ sjekke om stabelen st2 ikke er tom.
  20. Skriv ut innholdet i stabelen st2 pรฅ konsollen. " " legger til mellomrom mellom stabelelementene nรฅr de skrives ut pรฅ konsollen.
  21. Utfรธr pop()-funksjonen pรฅ stabelen st2 for รฅ fjerne toppelementet.
  22. Slutten av brรธdteksten til while-utsagnet.
  23. Slutten av hoveddelen av hoved()-funksjonen.

Stable i STL

STL (Standard Template Library) kommer med malklasser som gir felles C++ datastrukturer. Derfor kan en stack ogsรฅ implementeres i STL. Vi inkluderer ganske enkelt dette biblioteket i koden vรฅr og bruker det til รฅ definere en stabel.

stack<T> st; 

Syntaksen ovenfor erklรฆrer en stack st til elementer av 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();  
}

Utgang:

Stable i STL

Her er et skjermbilde av koden:

Stable i STL

Code Forklaring:

  1. Inkluder iostream-headerfilen i koden vรฅr for รฅ bruke funksjonene.
  2. Inkluder stabelhodefilen i koden vรฅr for รฅ bruke funksjonene.
  3. Inkluder cstdlib-headerfilen i koden vรฅr for รฅ bruke funksjonene.
  4. Inkluder std-navneomrรฅdet i koden vรฅr for รฅ bruke klassene uten รฅ kalle det.
  5. Kalle hoved()-funksjonen. Programlogikken skal legges til i hoveddelen av denne funksjonen.
  6. Deklarer en stabelst for รฅ lagre heltallsdata.
  7. Legg elementet 12 til stabelen.
  8. Legg elementet 19 til stabelen.
  9. Legg elementet 20 til stabelen.
  10. Skriv ut elementet pรฅ toppen av stabelen pรฅ konsollen.
  11. Skriv ut stรธrrelsen pรฅ stabelen pรฅ konsollen.
  12. Slutten av brรธdteksten til funksjonen main().

Spรธrsmรฅl og svar

En stakk fรธlger rekkefรธlgen ยซsist inn, fรธrst utยป, slik at den fjerner det nyeste elementet fรธrst. En kรธ fรธlger rekkefรธlgen ยซfรธrst inn, fรธrst utยป, og fjerner det eldste elementet fรธrst. Hver rekkefรธlge passer til forskjellige behandlingsbehov.

Ja. std::stack godtar enhver sekvensbeholder som sitt andre malargument, for eksempel std::stack >. Standarddekning passer i de fleste tilfeller, mens vektor kan forbedre minnelokaliteten nรฅr stakken vokser forutsigbart.

Bรฅde push og pop kjรธrer i konstant O(1) tid fordi stakken bare berรธrer det รธverste elementet. Den underliggende deque legger til elementer uten รฅ flytte eksisterende, slik at ytelsen forblir forutsigbar uavhengig av stakkestรธrrelsen.

std::stacken eksponerer ingen iteratorer, sรฅ en omrรฅdebasert lรธkke vil ikke kompileres. For รฅ lese hver verdi, kopier stakken og kall top() og pop() gjentatte ganger pรฅ kopien, eller velg en deque nรฅr traversering er nรธdvendig.

pop()-funksjonen returnerer void per design, og skiller fjerning fra tilgang for รฅ sikre unntak. Lesing og fjerning i ett trinn kan fรธre til tap av data hvis kopiering forรฅrsaker en feil, sรฅ du kaller top() fรธrst, deretter pop().

Nei. std::stacken tilbyr ingen innebygd synkronisering, sรฅ samtidige push- og pop-kall fra flere trรฅder forรฅrsaker datakapplรธp. Beskytt delt tilgang med en mutex eller en annen lรฅsemekanisme fรธr du bruker รฉn stakk pรฅ tvers av trรฅder.

Ja. AI-kodingsassistenter leser en kommentar eller et funksjonsnavn og produserer std::stack-deklarasjoner, push- og pop-lรธkker og traversallogikk. Revร… vise de genererte grensekontrollene, som for eksempel empty()-tester fรธr pop(), er fortsatt viktig for sikre programmer.

Ja. GitHub Copilot fullfรธrer push-, pop-, top- og empty()-kall mens du skriver og foreslรฅr containervalg. Det er 2026. C++ Kodeintelligens legger til symbolbevissthet, slik at forslag til flere filers stakk forblir konsistente.

Oppsummer dette innlegget med: