Virna sisse C++ STL näitega

⚡ Nutikas kokkuvõte

Virna sisse C++ STL rakendab LIFO konteineri adapterit, mis lisab ja eemaldab elemente ühest otsast, mässidesping alusjärjestuse konteiner, näiteks deque, vector või list järjestatud andmete haldamiseks.

  • 🔘 LIFO põhimõte: std::stack järgib viimasena sisse, esimesena välja järjestust, seega viimasena lükatud element on alati esimesena eemaldatav.
  • 📦 Konteineri adapter: Stack mähib olemasoleva jadakonteineri ja vaikimisi dequestab, kui konteineri tüüpi pole esitatud.
  • Põhitegevused: Funktsioonid push, pop ja top lisavad vastavalt elemendi, eemaldavad ülemise elemendi ja loevad ülemise elemendi.
  • 🔍 Riiklikud kontrollid: Funktsioonid empty ja size näitavad, kas pinus on elemente ja kui palju seal hetkel on.
  • 🔁 Lisafunktsioonid: Funktsioonid emplace ja swap loovad elemendi kohapeale ning vahetavad kahe pinu sisu.
  • 🤖 AI abi: Tehisintellekti kodeerimisassistendid, näiteks GitHub Copilot, genereerivad lühikese kommentaari põhjal pinu tõuke-, hüpikakna- ja läbimisvorminguid.

Virna sisse C++ STL

Mis on std::stack?

Virn on andmestruktuur, mis töötab LIFO (Last In First Out) tehnikal. Std::stack võimaldab elemente lisada ja eemaldada ainult ühest otsast.

Klass std::stack on konteineriadapter. Konteinerobjektid hoiavad sarnase andmetüübiga andmeid. Pinu saab luua erinevatest järjestuskonteineritest. Kui konteinerit ei anta, kasutatakse vaikimisi deque konteinerit. Konteineriadapterid ei toeta iteraatoreid, seega ei saa neid andmete manipuleerimiseks kasutada.

Virna süntaks

Virna loomiseks peame kaasama päisefail meie koodis. Seejärel kasutame seda süntaksit std::stack:

template <class Type, class Container = deque<Type> > class stack;
  • KASUTUSALA – on std::stackis sisalduva elemendi tüüp. See võib olla ükskõik milline kehtiv C++ tüüp või isegi kasutaja määratud tüüp.
  • Konteiner – on aluseks oleva konteineri objekti tüüp.

Liikmete tüübid

Siin on virnaliikmete tüübid:

  • väärtuse_tüüp– Esimene malliparameeter, T. See tähistab elemendi tüüpe.
  • konteineri_tüüp– Teine malliparameeter, Container. See tähistab aluseks oleva konteineri tüüpi.
  • suuruse_tüüp– Märgita integraaltüüp.

OperaStackis

A C++ stack toetab järgmisi põhitoiminguid:

  • lükkama – See lisab/lükkab eseme virna.
  • pop- – See eemaldab/paistab üksuse virnast.
  • peek – Tagastab virna ülemise elemendi seda eemaldamata.
  • on täis – Kontrollib, kas virn on täis.
  • on tühi – Kontrollib, kas pinu on tühi.

Virna rakendamine

Järgmised sammud näitavad, kuidas virna ülemine osa nihkub, kui esemeid lükatakse ja seejärel tõstetakse:

1. samm) Algselt on meil tühi pinu. Tühja pinu ülemine punkt seatakse väärtuseks -1.

2. samm) Järgmisena oleme elemendi 5 virna lükanud. Virna ülemine ots osutab elemendile 5.

3. samm) Järgmisena oleme elemendi 50 virna lükanud. Virna ülemine osa nihkub ja osutab elemendile 50.

4. samm) Seejärel teostasime pinust eemaldamise operatsiooni, eemaldades ülemise elemendi. Element 50 eemaldatakse pinust. Pinu ülemine ots osutab nüüd elemendile 5.

Virna rakendamine

push () ja pop ()

Funktsioon stack::push() lisab pinu tippu uue elemendi. Pärast sisestamist suureneb pinu suurus 1 võrra. Funktsiooni süntaks on järgmine:

stack.push(value)

Väärtus on üksus, mis tuleb virna sisestada.

Funktsioon stack::pop() eemaldab pinust kõige ülemise elemendi. See on pinu uusim element. Pärast eemaldamist vähendatakse pinu suurust 1 võrra. Funktsiooni süntaks on järgmine:

stack.pop()

Funktsioon ei võta parameetreid.

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

Väljund:

push () ja pop ()

Siin on koodi ekraanipilt:

push () ja pop ()

Code Selgitus:

  1. Selle funktsioonide kasutamiseks lisage meie koodi iostreami päisefail.
  2. Selle funktsioonide kasutamiseks lisage meie koodi virna päise fail.
  3. Lisage meie koodi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  4. Kutsuge välja funktsioon main(). Selle funktsiooni sisse tuleks lisada programmiloogika.
  5. Looge täisarvuliste väärtuste salvestamiseks virn st.
  6. Kasutage funktsiooni push(), et sisestada virna väärtus 10.
  7. Kasutage funktsiooni push(), et sisestada virna väärtus 20.
  8. Kasutage funktsiooni push(), et sisestada virna väärtus 30.
  9. Kasutage funktsiooni push(), et sisestada virna väärtus 40.
  10. Funktsiooni pop() abil eemaldage virust ülemine element, see tähendab 40. Ülemine element saab nüüd 30-ks.
  11. Funktsiooni pop() abil eemaldage virust ülemine element, see tähendab 30. Ülemine element saab nüüd 20-ks.
  12. Kontrollige, kas virn EI ole tühi, kasutage while-silmust ja tühja() funktsiooni. ! on operaator EI.
  13. Konsooli virna praeguse sisu printimine.
  14. Kutsuge virna funktsiooni pop().
  15. While-ahela keha lõpp.
  16. Funktsiooni main() keha lõpp.

tühi(), suurus(), top()

Virnadel on sisseehitatud funktsioonid, mida saate kasutada virna ja selle väärtustega mängimiseks. Nende hulka kuuluvad:

  • tühi()– kontrollib, kas pinu on tühi või mitte.
  • suurus ()– tagastab pinu suuruse, st pinus olevate elementide arvu.
  • ülemine()– pääseb juurde ülemisele pinuelemendile.

Näide 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;
}

Väljund:

tühi(), suurus(), top()

Siin on koodi ekraanipilt:

tühi(), suurus(), top()

Code Selgitus:

  1. Selle funktsioonide kasutamiseks lisage meie koodi iostreami päisefail.
  2. Selle funktsioonide kasutamiseks lisage meie koodi virna päise fail.
  3. Lisage meie programmi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  4. Looge funktsioon createStack, mida saame kasutada virna mystacki loomiseks. Virn sisaldab täisarvude komplekti.
  5. Funktsiooni createStack keha algus.
  6. Looge mystacki andmetüübi eksemplar ja andke sellele nimi ms.
  7. Kasutage tsüklit while ja tühja() funktsiooni, et kontrollida, kas virn on tühi.
  8. While-tsükli keha algus.
  9. Kasutage virna ülaossa salvestatud funktsiooni top(). Märk \t loob uue vahekaardi.
  10. Kasutage virna ülaosas oleva elemendi kustutamiseks funktsiooni pop().
  11. While-ahela keha lõpp.
  12. Printige konsoolile tühi rida.
  13. Funktsiooni createStack keha lõpp.
  14. Kutsuge välja funktsioon main(). Programmi loogika tuleks lisada funktsiooni main() kehasse.
  15. Funktsiooni main() keha algus.
  16. Loo virnaobjekt st.
  17. Kasutage funktsiooni push(), et sisestada element 32 virna.
  18. Kasutage funktsiooni push(), et sisestada element 21 virna.
  19. Kasutage funktsiooni push(), et sisestada element 39 virna.
  20. Kasutage funktsiooni push(), et sisestada element 89 virna.
  21. Kasutage funktsiooni push(), et sisestada element 25 virna.
  22. Printige konsoolile teksti.
  23. Kutsuge üles funktsioon createStack, et täita ülaltoodud virna sisestamise toiminguid.
  24. Printige muu teksti kõrvale konsooli virna suurus.
  25. Printige konsooli virna ülaosas olev element.
  26. Printige konsoolile teksti.
  27. Kustutage virna ülaosas olev element. Seejärel tagastab see virna jäänud elemendid.
  28. Ülaltoodud toimingute tegemiseks helistage funktsioonile createStack.
  29. Programm peab pärast edukat lõpetamist tagastama väärtuse.
  30. Funktsiooni main() keha lõpp.

emplace() ja swap()

Need on muud sisseehitatud virna funktsioonid:

  • aseta()– konstrueerib ja lisab seejärel uue elemendi pinu tippu.
  • vaheta()– vahetab pinu sisu teise pinu sisuga.

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

Väljund:

emplace() ja swap()

Siin on koodi ekraanipilt:

emplace() ja swap()

Code Selgitus:

  1. Selle funktsioonide kasutamiseks lisage meie koodi iostreami päisefail.
  2. Selle funktsioonide kasutamiseks lisage meie koodi virna päise fail.
  3. Selle funktsioonide kasutamiseks lisage meie koodi meie koodi päisefail cstdlib.
  4. Lisage meie koodi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  5. Kutsuge funktsioon main(). Programmi loogika lisatakse selle funktsiooni kehasse.
  6. Täisarvude väärtuste salvestamiseks deklareerige virn nimega st1.
  7. Täisarvude väärtuste salvestamiseks deklareerige virn nimega st2.
  8. Kasutage funktsiooni emplace(), et sisestada täisarv 12 virna nimega st1.
  9. Kasutage funktsiooni emplace(), et sisestada täisarv 19 virna nimega st1.
  10. Kasutage funktsiooni emplace(), et sisestada täisarv 20 virna nimega st2.
  11. Kasutage funktsiooni emplace(), et sisestada täisarv 23 virna nimega st2.
  12. Kasutage funktsiooni swap(), et vahetada kahe virna, st1 ja st2, sisu. Virna st1 sisu tuleks teisaldada virna st2. Virna st2 sisu tuleks teisaldada virna st1.
  13. Printige konsoolile teksti.
  14. Kasutage lauset while ja funktsiooni empty(), et kontrollida, kas pinu st1 pole tühi.
  15. Printige konsoolile virna st1 sisu. " " lisab virnaelementide vahele ruumi nende konsoolile printimisel.
  16. Ülemise elemendi eemaldamiseks käivitage virnas st1 funktsioon pop().
  17. Avaldise while põhiosa lõpp.
  18. Printige konsoolile teksti. Endl on a C++ märksõna lõpurea jaoks. See viib hiirekursori järgmisele reale, et alustada sealt printimist.
  19. Kasutage lauset while ja funktsiooni empty(), et kontrollida, kas pinu st2 pole tühi.
  20. Printige konsoolile virna st2 sisu. " " lisab virnaelementide vahele ruumi nende konsoolile printimisel.
  21. Ülemise elemendi eemaldamiseks käivitage virnas st2 funktsioon pop().
  22. Avaldise while põhiosa lõpp.
  23. Funktsiooni main() keha lõpp.

Virna STL-is

STL (Standard Template Library) on varustatud malliklassidega, mis pakuvad ühist C++ andmestruktuurid. Seetõttu saab virna rakendada ka STL-is. Lisame selle teegi lihtsalt oma koodi ja kasutame seda virna määratlemiseks.

stack<T> st; 

Ülaltoodud süntaks deklareerib andmetüübi T elementidele virna st.

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

Väljund:

Virna STL-is

Siin on koodi ekraanipilt:

Virna STL-is

Code Selgitus:

  1. Selle funktsioonide kasutamiseks lisage meie koodi iostreami päisefail.
  2. Selle funktsioonide kasutamiseks lisage meie koodi virna päise fail.
  3. Selle funktsioonide kasutamiseks lisage meie koodi meie koodi päisefail cstdlib.
  4. Lisage meie koodi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  5. Kutsuge funktsioon main(). Programmi loogika tuleks lisada selle funktsiooni kehasse.
  6. Täisarvuandmete salvestamiseks deklareerige virn st.
  7. Lisage virnasse element 12.
  8. Lisage virnasse element 19.
  9. Lisage virnasse element 20.
  10. Printige konsooli virna ülaosas olev element.
  11. Printige konsoolile virna suurus.
  12. Funktsiooni main() keha lõpp.

KKK

Pinu puhul järgitakse järjekorda „Viimane sisse, esimene välja“, seega eemaldatakse esimesena kõige uuem element. Järjekord järgib järjekorda „Esimene sisse, esimene välja“, eemaldades esimesena vanima elemendi. Igaüks neist sobib erinevate töötlemisvajadustega.

Jah. std::stack aktsepteerib teise malliargumendina mis tahes jada konteinerit, näiteks std::stack Vaikimisi sobib see enamiku juhtudega, samas kui vector saab parandada mälu lokaalsust, kui pinu kasvab prognoositavalt.

Nii push kui ka pop töötavad konstantse O(1) ajaga, kuna pinu puudutab ainult oma ülemist elementi. Alumine deque lisab elemente olemasolevaid nihutamata, seega jääb jõudlus prognoositavaks olenemata pinu suurusest.

std::stack ei paku iteraatoreid, seega vahemikupõhine tsükkel ei kompileeru. Iga väärtuse lugemiseks kopeeri pinu ja kutsu koopia põhjal korduvalt esile funktsioone top() ja pop() või vali deque, kui läbimine on vajalik.

Funktsioon pop() tagastab teadupärast tühise väärtuse, eraldades eemaldamise juurdepääsust erandite ohutuse tagamiseks. Lugemine ja eemaldamine ühe sammuna võivad andmeid kaotada, kui kopeerimine annab vea, seega kutsutakse esmalt välja funktsioon top() ja seejärel funktsioon pop().

Ei. std::stack ei paku sisseehitatud sünkroniseerimist, seega samaaegsed push- ja pop-kõned mitmest lõimest põhjustavad andmevõidujooksu. Enne ühe pinu kasutamist lõimede vahel kaitske jagatud juurdepääsu mutexi või mõne muu lukustusmehhanismiga.

Jah. Tehisintellekti kodeerimisassistendid loevad kommentaari või funktsiooni nime ja loovad std::stack deklaratsioonid, push- ja pop-tsüklid ning läbimisloogika. RevTurvaliste programmide jaoks on oluline vaadata genereeritud piirikontrolle, näiteks enne pop() funktsiooni käivitamist tehtud tühjad() testid.

Jah. GitHubi koopia sooritab push, pop, top ja empty() käske kirjutamise ajal ning pakub konteineri valikuid. See on 2026. aasta C++ Koodi intelligentsus lisab sümboliteadlikkust, nii et mitme faili pinu soovitused jäävad järjepidevaks.

Võta see postitus kokku järgmiselt: