Stapla in C++ STL med Exempel

โšก Smart sammanfattning

Stapla in C++ STL implementerar en LIFO-containeradapter som lรคgger till och tar bort element frรฅn en enda รคnde, wrapping en underliggande sekvensbehรฅllare sรฅsom deque, vektor eller lista fรถr att hantera ordnad data.

  • ๐Ÿ”˜ LIFO-principen: std::stack fรถljer ordningen Last In First Out, sรฅ det senast puttade elementet รคr alltid det fรถrsta som tas bort.
  • ๐Ÿ“ฆ Behรฅllaradapter: En stack omsluter en befintlig sekvensbehรฅllare och anvรคnder som standard deque nรคr ingen containertyp anges.
  • โž• Kรคrnverksamhet: Funktionerna push, pop och top infogar ett objekt, tar bort det รถversta objektet respektive lรคser det รถversta objektet.
  • ๐Ÿ” Statliga kontroller: Funktionerna empty och size rapporterar om stacken innehรฅller element och hur mรฅnga den fรถr nรคrvarande lagrar.
  • ๐Ÿ” Extra funktioner: Funktionerna emplace och swap bygger ett element pรฅ plats och utbyter innehรฅllet i tvรฅ stackar.
  • ๐Ÿค– AI-hjรคlp: AI-kodningsassistenter som GitHub Copilot genererar standardinstรคllningar fรถr stack-push, pop och traversal frรฅn en kort kommentar.

Stapla in C++ STL

Vad รคr std::stack?

En stack รคr en datastruktur som fungerar baserat pรฅ LIFO-tekniken (Last In First Out). Med std::stack kan element lรคggas till och tas bort endast frรฅn ena รคnden.

Klassen std::stack รคr en containeradapter. Containerobjekt innehรฅller data av en liknande datatyp. Du kan skapa en stack frรฅn olika sekvensbehรฅllare. Om ingen container anges kommer deque-behรฅllaren att anvรคndas som standard. Containeradaptrar stรถder inte iteratorer, sรฅ de kan inte anvรคndas fรถr att manipulera data.

Stack syntax

Fรถr att skapa en stack mรฅste vi inkludera header-fil i vรฅr kod. Vi anvรคnder sedan denna syntax fรถr att definiera std::stack:

template <class Type, class Container = deque<Type> > class stack;
  • Typ โ€“ รคr den typ av element som finns i std::stacken. Den kan vara vilken som helst giltig C++ typ eller till och med en anvรคndardefinierad typ.
  • Behรฅllare โ€“ รคr typen av underliggande containerobjekt.

Medlemstyper

Hรคr รคr stackmedlemstyper:

  • vรคrdetypโ€“ Den fรถrsta mallparametern, T. Den anger elementtyperna.
  • containertypโ€“ Den andra mallparametern, Container. Den anger den underliggande containertypen.
  • storlekstypโ€“ Osignerad integraltyp.

Operationer i Stack

A C++ stack stรถder fรถljande grundlรคggande operationer:

  • tryck โ€“ Den lรคgger till/skjuter in ett objekt i stapeln.
  • pop โ€“ Den tar bort/poppar upp ett fรถremรฅl frรฅn hรถgen.
  • titt โ€“ Returnerar det รถversta objektet i stacken utan att ta bort det.
  • รคrFull โ€“ Kontrollerar om en stapel รคr full.
  • รคr tom โ€“ Kontrollerar om en stapel รคr tom.

Stackimplementering

Fรถljande steg visar hur toppen av stapeln fรถrskjuts nรคr fรถremรฅl trycks och sedan poppas upp:

Steg 1) Vi har initialt en tom stack. Toppen av en tom stack sรคtts till -1.

Steg 2) Sedan har vi tryckt in element 5 i stacken. Toppen av stacken kommer att peka mot element 5.

Steg 3) Hรคrnรคst har vi tryckt in element 50 i stacken. Toppen av stacken fรถrskjuts och pekar mot element 50.

Steg 4) Vi har sedan utfรถrt en pop-operation, dรคr vi tar bort det รถversta elementet frรฅn stacken. Element 50 poppas upp frรฅn stacken. Toppen av stacken pekar nu mot element 5.

Stackimplementering

push() och pop()

Funktionen stack::push() lรคgger till ett nytt objekt hรถgst upp i stacken. Stackstorleken รถkas med 1 efter infogningen. Funktionen anvรคnder fรถljande syntax:

stack.push(value)

Vรคrdet รคr objektet som ska infogas i stapeln.

Funktionen stack::pop() tar bort det รถversta elementet i stacken. Detta รคr det nyaste elementet i stacken. Stackstorleken minskas med 1 efter borttagningen. Hรคr รคr funktionens syntax:

stack.pop()

Funktionen tar inga parametrar.

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

Produktion:

push() och pop()

Hรคr รคr en skรคrmdump av koden:

push() och pop()

Code Fรถrklaring:

  1. Inkludera iostream-huvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
  2. Inkludera stackhuvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
  3. Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
  4. Anropa main()-funktionen. Programlogiken bรถr lรคggas till i denna funktion.
  5. Skapa en stackst fรถr att lagra heltalsvรคrden.
  6. Anvรคnd push()-funktionen fรถr att infoga vรคrdet 10 i stacken.
  7. Anvรคnd push()-funktionen fรถr att infoga vรคrdet 20 i stacken.
  8. Anvรคnd push()-funktionen fรถr att infoga vรคrdet 30 i stacken.
  9. Anvรคnd push()-funktionen fรถr att infoga vรคrdet 40 i stacken.
  10. Anvรคnd pop()-funktionen fรถr att ta bort det รถversta elementet frรฅn stacken, det vill sรคga 40. Det รถversta elementet blir nu 30.
  11. Anvรคnd pop()-funktionen fรถr att ta bort det รถversta elementet frรฅn stacken, det vill sรคga 30. Det รถversta elementet blir nu 20.
  12. Anvรคnd en while loop och empty() funktion fรถr att kontrollera om stacken INTE รคr tom. Den ! รคr NOT-operatรถren.
  13. Skriver ut det aktuella innehรฅllet i stapeln pรฅ konsolen.
  14. Anropa pop()-funktionen i stacken.
  15. Slutet pรฅ while-loopens kropp.
  16. Slutet pรฅ huvuddelen () funktion.

tomma(), storlek(), topp()

Stackar har inbyggda funktioner som du kan anvรคnda fรถr att leka med stacken och dess vรคrden. Dessa inkluderar:

  • tรถmma()โ€“ kontrollerar om en stapel รคr tom eller inte.
  • storlek()โ€“ returnerar stackens storlek, det vill sรคga antalet element i en stack.
  • bรคsta()โ€“ รถppnar stackelementet hรถgst upp.

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

Produktion:

tomma(), storlek(), topp()

Hรคr รคr en skรคrmdump av koden:

tomma(), storlek(), topp()

Code Fรถrklaring:

  1. Inkludera iostream-huvudfilen i vรฅr kod fรถr att kunna anvรคnda dess funktioner.
  2. Inkludera stackhuvudfilen i vรฅr kod fรถr att kunna anvรคnda dess funktioner.
  3. Inkludera std-namnomrรฅdet i vรฅrt program fรถr att kunna anvรคnda dess klasser utan att anropa det.
  4. Skapa funktionen createStack som vi kan anvรคnda fรถr att skapa stacken mystack. Hรถgen kommer att innehรฅlla en uppsรคttning heltal.
  5. Bรถrjan av kroppen fรถr createStack-funktionen.
  6. Skapa en instans av mystack-datatypen och ge den namnet ms.
  7. Anvรคnd while-loopen och funktionen empty() fรถr att kontrollera om stacken รคr tom.
  8. Bรถrjan av while-loopens kropp.
  9. Anvรคnd top()-funktionen lagrad รถverst i stacken. Tecknet \t skapar en ny flik.
  10. Anvรคnd pop()-funktionen fรถr att ta bort elementet รถverst i stacken.
  11. Slutet pรฅ while-loopens kropp.
  12. Skriv ut en tom rad pรฅ konsolen.
  13. Slutet pรฅ kroppen av createStack-funktionen.
  14. Anropa main()-funktionen. Programlogiken bรถr lรคggas till i huvuddelen av main()-funktionen.
  15. Bรถrjan av huvuddelen av funktion main().
  16. Skapa ett stackobjekt st.
  17. Anvรคnd push()-funktionen fรถr att infoga elementet 32 โ€‹โ€‹i stacken.
  18. Anvรคnd push()-funktionen fรถr att infoga elementet 21 โ€‹โ€‹i stacken.
  19. Anvรคnd push()-funktionen fรถr att infoga elementet 39 โ€‹โ€‹i stacken.
  20. Anvรคnd push()-funktionen fรถr att infoga elementet 89 โ€‹โ€‹i stacken.
  21. Anvรคnd push()-funktionen fรถr att infoga elementet 25 โ€‹โ€‹i stacken.
  22. Skriv ut lite text pรฅ konsolen.
  23. Anropa createStack-funktionen fรถr att utfรถra ovanstรฅende infogningsoperationer i stacken.
  24. Skriv ut stapelns storlek pรฅ konsolen tillsammans med annan text.
  25. Skriv ut elementet รถverst i stapeln pรฅ konsolen.
  26. Skriv ut lite text pรฅ konsolen.
  27. Ta bort elementet รถverst i stapeln. Det kommer sedan att returnera de element som finns kvar i stacken.
  28. Anropa createStack-funktionen fรถr att utfรถra ovanstรฅende operationer.
  29. Programmet mรฅste returnera vรคrde efter framgรฅngsrikt slutfรถrande.
  30. Slutet pรฅ huvuddelen av funktion main().

emplace() och swap()

Det hรคr รคr andra inbyggda stackfunktioner:

  • placera()โ€“ konstruerar och infogar sedan ett nytt element hรถgst upp i stacken.
  • byta()โ€“ byter stackinnehรฅll med en annan stacks innehรฅll.

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

Produktion:

emplace() och swap()

Hรคr รคr en skรคrmdump av koden:

emplace() och swap()

Code Fรถrklaring:

  1. Inkludera iostream-huvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
  2. Inkludera stackhuvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
  3. Inkludera cstdlib-huvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
  4. Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
  5. Anropa main()-funktionen. Programlogiken kommer att lรคggas till i kroppen av denna funktion.
  6. Deklarera en stack med namnet st1 fรถr att lagra heltalsvรคrden.
  7. Deklarera en stack med namnet st2 fรถr att lagra heltalsvรคrden.
  8. Anvรคnd funktionen emplace() fรถr att infoga heltal 12 i stacken som heter st1.
  9. Anvรคnd funktionen emplace() fรถr att infoga heltal 19 i stacken som heter st1.
  10. Anvรคnd funktionen emplace() fรถr att infoga heltal 20 i stacken som heter st2.
  11. Anvรคnd funktionen emplace() fรถr att infoga heltal 23 i stacken som heter st2.
  12. Anvรคnd swap()-funktionen fรถr att byta innehรฅllet i de tvรฅ stackarna, st1 och st2. Innehรฅllet i stack st1 ska flyttas till stack st2. Innehรฅllet i stack st2 ska flyttas till stack st1.
  13. Skriv ut lite text pรฅ konsolen.
  14. Anvรคnd while-satsen och funktionen empty() fรถr att kontrollera om stacken st1 inte รคr tom.
  15. Skriv ut innehรฅllet i stack st1 pรฅ konsolen. โ€ โ€ lรคgger till utrymme mellan stapelelementen nรคr du skriver ut dem pรฅ konsolen.
  16. Kรถr pop()-funktionen pรฅ stacken st1 fรถr att ta bort det รถversta elementet.
  17. Slutet pรฅ stundens brรถdtext.
  18. Skriv ut lite text pรฅ konsolen. ร„nden รคr en C++ nyckelord fรถr slutrad. Den flyttar muspekaren till nรคsta rad fรถr att bรถrja skriva ut dรคrifrรฅn.
  19. Anvรคnd while-satsen och funktionen empty() fรถr att kontrollera om stacken st2 inte รคr tom.
  20. Skriv ut innehรฅllet i stack st2 pรฅ konsolen. โ€ โ€ lรคgger till utrymme mellan stapelelementen nรคr du skriver ut dem pรฅ konsolen.
  21. Kรถr pop()-funktionen pรฅ stacken st2 fรถr att ta bort det รถversta elementet.
  22. Slutet pรฅ stundens brรถdtext.
  23. Slutet pรฅ huvuddelen av funktionen main().

Stapla i STL

STL (Standard Template Library) kommer med mallklasser som ger gemensamma C++ datastrukturer. Dรคrfรถr kan en stack ocksรฅ implementeras i STL. Vi inkluderar helt enkelt detta bibliotek i vรฅr kod och anvรคnder det fรถr att definiera en stack.

stack<T> st; 

Ovanstรฅende syntax deklarerar en stack st till element av datatyp T.

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

Produktion:

Stapla i STL

Hรคr รคr en skรคrmdump av koden:

Stapla i STL

Code Fรถrklaring:

  1. Inkludera iostream-huvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
  2. Inkludera stackhuvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
  3. Inkludera cstdlib-huvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
  4. Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
  5. Anropa main()-funktionen. Programlogiken bรถr lรคggas till i kroppen av denna funktion.
  6. Deklarera en stack st fรถr att lagra heltalsdata.
  7. Lรคgg till elementet 12 i stapeln.
  8. Lรคgg till elementet 19 i stapeln.
  9. Lรคgg till elementet 20 i stapeln.
  10. Skriv ut elementet รถverst i stapeln pรฅ konsolen.
  11. Skriv ut stapelns storlek pรฅ konsolen.
  12. Slutet pรฅ kroppen av funktionen main().

Vanliga frรฅgor

En stack fรถljer ordningen "sist in, fรถrst ut", sรฅ den tar bort det senaste elementet fรถrst. En kรถ fรถljer ordningen "fรถrst in, fรถrst ut", och tar bort det รคldsta elementet fรถrst. Varje element passar olika bearbetningsbehov.

Ja. std::stack accepterar vilken sekvensbehรฅllare som helst som sitt andra mallargument, till exempel std::stack >. Standarddequen passar de flesta fall, medan vector kan fรถrbรคttra minneslokaliteten nรคr stacken vรคxer fรถrutsรคgbart.

Bรฅde push och pop kรถrs i konstant O(1) tid eftersom stacken bara vidrรถr sitt รถversta element. Den underliggande deque-funktionen lรคgger till objekt utan att flytta befintliga, sรฅ prestandan fรถrblir fรถrutsรคgbar oavsett stackens storlek.

std::stacken exponerar inga iteratorer, sรฅ en intervallbaserad loop kommer inte att kompileras. Fรถr att lรคsa varje vรคrde, kopiera stacken och anropa top() och pop() upprepade gรฅnger pรฅ kopian, eller vรคlj en deque nรคr traversal krรคvs.

Funktionen pop() returnerar void av designen, vilket separerar borttagning frรฅn รฅtkomst fรถr undantagssรคkerhet. Att lรคsa och ta bort i ett steg kan leda till datafรถrlust om kopieringen orsakade ett fel, sรฅ du anropar fรถrst top() och sedan pop().

Nej. std::stacken erbjuder ingen inbyggd synkronisering, sรฅ samtidiga push- och pop-anrop frรฅn flera trรฅdar orsakar datakapplรถpningar. Skydda delad รฅtkomst med en mutex eller annan lรฅsmekanism innan du anvรคnder en stack รถver flera trรฅdar.

Ja. AI-kodningsassistenter lรคser en kommentar eller ett funktionsnamn och producerar std::stack-deklarationer, push- och pop-loopar och traversallogik. RevAtt visa de genererade grรคnskontrollerna, sรฅsom empty()-tester fรถre pop(), รคr fortfarande viktigt fรถr sรคkra program.

Ja. GitHub Copilot slutfรถr push-, pop-, top- och empty()-anrop medan du skriver och fรถreslรฅr containerval. Det รคr 2026. C++ Kodintelligens รถkar symbolmedvetenhet, sรฅ att fรถrslag pรฅ flera filers stackar fรถrblir konsekventa.

Sammanfatta detta inlรคgg med: