Virna sisse C++ STL näitega

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.

Std::stack klass on konteineri adapter. Konteinerobjektid sisaldavad sarnast andmetüüpi andmeid. Saate luua virna erinevatest jadakonteineritest. Kui konteinerit ei esitata, kasutatakse vaikimisi deque-konteinerit. Konteineridapterid ei toeta iteraatoreid, seega ei saa neid andmetega 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:

  • value_type- esimene malli parameeter T. See tähistab elementide tüüpe.
  • konteineri tüüp – malli teine ​​parameeter, konteiner. See tähistab aluseks olevat konteineri tüüpi.
  • suuruse_tüüp – märgita integraaltüüp.

OperaStackis

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

  • push – lisab/lükkab üksuse virna.
  • pop – see eemaldab/hüppab üksuse virnast.
  • piiluma – tagastab virna ülemise üksuse seda eemaldamata.
  • isFull – kontrollib, kas virn on täis.
  • isEmpty – kontrollib, kas virn on tühi.

Virna rakendamine

Virna rakendamine

Step 1) Meil on esialgu tühi virn. Tühja virna ülaosa väärtus on -1.

Step 2) Järgmiseks oleme lükanud elemendi 5 virna. Virna ülaosa osutab elemendile 5.

Step 3) Järgmiseks oleme lükanud elemendi 50 virna. Virna ülaosa nihkub ja osutab elemendile 50.

Step 4) Seejärel tegime pop-operatsiooni, eemaldades virnast ülemise elemendi. Element 50 tõstetakse virnast välja. Virna ülaosa osutab nüüd elemendile 5.

push () ja pop ()

Funktsioonid virn::push() lisavad uue üksuse virna ülaossa. Pärast sisestamist suurendatakse virna suurust 1 võrra. Funktsioon võtab järgmise süntaksi:

stack.push(value)

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

Funktsioon Virn:: pop() eemaldab virna ülemise elemendi. See on virna uusim üksus. Pärast eemaldamist vähendatakse virna suurust 1 võrra. Siin on funktsiooni süntaks:

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

Koodi 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. Kasutage funktsiooni pop(), et eemaldada virnast ü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 virn on tühi või mitte.
  • suurus()- tagastab virna suuruse, st elementide arvu virnas.
  • top()- pääseb juurde ülaosas olevale virnaelemendile.

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(),ülemine()

Siin on koodi ekraanipilt:

tühi(),suurus(),ülemine()

Koodi 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:

  • emplace()- konstrueerib ja lisab seejärel uue elemendi virna ülaossa.
  • swap() – vahetab virna sisu teise virna 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()& swap()

Siin on koodi ekraanipilt:

emplace()& swap()

Koodi 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

Koodi 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.

kokkuvõte

  • Virn on andmestruktuur, mis töötab LIFO (Last In first Out) tehnikal.
  • Std::stack võimaldab üksusi lisada ja eemaldada ainult ühest otsast.
  • Std::stack klass on konteineri adapter, mis sisaldab sarnast andmetüüpi üksusi.
  • Virna saab luua erinevatest jadakonteineritest.
  • Kui te konteinerit ei esita, kasutatakse vaikimisi kustutamise konteinerit.
  • Funktsioon push() on üksuste sisestamiseks virna.
  • Funktsioon pop() on toimingu ülemise elemendi eemaldamiseks.
  • Funktsioon tühi() on selleks, et kontrollida, kas virn on tühi või mitte.