Rakd be C++ STL példával

⚡ Okos összefoglaló

Rakd be C++ Az STL egy LIFO konténeradaptert valósít meg, amely elemeket ad hozzá és távolít el egyetlen végről, körbefutvaping egy mögöttes szekvenciatároló, például deque, vector vagy list a rendezett adatok kezelésére.

  • 🔘 LIFO elv: Az std::stack az Utolsóként be, elsőként ki sorrendet követi, tehát a legutóbb betolt elem mindig az elsőként eltávolított elem.
  • 📦 Tartály adapter: Egy verem egy meglévő szekvenciatárolót csomagol be, és alapértelmezés szerint deque-t használ, ha nincs megadva tárolótípus.
  • Alapvető műveletek: A push, pop és top függvények rendre beszúrnak egy elemet, eltávolítják a legfelső elemet, illetve beolvassák a legfelső elemet.
  • 🔍 Állami ellenőrzések: Az empty és size függvények jelzik, hogy a verem tartalmaz-e elemeket, és ha igen, akkor jelenleg hányat tárol.
  • 🔁 Extra funkciók: Az emplace és swap függvények egy elemet hoznak létre a helyben, és két verem tartalmát cserélik ki.
  • 🤖 AI segítség: Az olyan mesterséges intelligencia által fejlesztett kódolási asszisztensek, mint a GitHub Copilot, egy rövid megjegyzésből generálnak stack push, pop és traversal szabványos kódrészleteket.

Rakd be C++ STL

Mi az std::stack?

A verem egy olyan adatstruktúra, amely a LIFO (Last In First Out) technikán alapul. Az std::stack csak az egyik végéről teszi lehetővé az elemek hozzáadását és eltávolítását.

Az std::stack osztály egy konténeradapter. A konténerobjektumok hasonló adattípusú adatokat tárolnak. Különböző szekvenciakonténerekből hozhat létre verem. Ha nincs megadva konténer, akkor alapértelmezés szerint a deque konténer lesz használva. A konténeradapterek nem támogatják az iterátorokat, így nem használhatók adatok manipulálására.

Stack szintaxis

Verem létrehozásához tartalmaznunk kell a fejlécfájlt a kódunkban. Ezután ezt a szintaxist használjuk az std::stack:

template <class Type, class Container = deque<Type> > class stack;
  • típus – az std::stackben található elem típusa. Bármilyen érvényes lehet C++ típus vagy akár egy felhasználó által meghatározott típus.
  • Konténer – az alapul szolgáló tárolóobjektum típusa.

Tagtípusok

Íme a veremtag típusok:

  • értéktípus– Az első sablonparaméter, T. Ez jelöli az elemtípusokat.
  • konténertípus– A második sablonparaméter, a Container. Ez jelöli az alapul szolgáló konténer típusát.
  • méret_típus– Előjel nélküli integrál típus.

Operaa Stackben

A C++ A verem a következő alapvető műveleteket támogatja:

  • nyomja – Hozzáad/berak egy elemet a verembe.
  • pop – Eltávolít/kivesz egy elemet a veremből.
  • kandikál – Visszaadja a verem legfelső elemét anélkül, hogy eltávolítaná azt.
  • tele van – Ellenőrzi, hogy a halom tele van-e.
  • üres – Ellenőrzi, hogy egy verem üres-e.

Stack megvalósítás

A következő lépések bemutatják, hogyan tolódik el a halom teteje, amikor az elemeket eltoljuk, majd kiemeljük:

1. lépés) Kezdetben van egy üres verem. Az üres verem tetejét -1-re állítjuk.

2. lépés) Ezután beillesztettük az 5. elemet a verembe. A verem teteje az 5. elemre fog mutatni.

3. lépés) Ezután beillesztettük az 50-es elemet a verembe. A verem teteje eltolódik, és az 50-es elemre mutat.

4. lépés) Ezután elvégeztünk egy kiemelési műveletet, eltávolítva a legfelső elemet a veremből. Az 50-es elem kiemelésre került a veremből. A verem teteje most az 5-ös elemre mutat.

Stack megvalósítás

push() és pop()

A stack::push() függvény egy új elemet ad hozzá a verem tetejéhez. A beszúrás után a verem mérete 1-gyel nő. A függvény szintaxisa a következő:

stack.push(value)

Az érték a verembe beszúrandó elem.

A stack::pop() függvény eltávolítja a verem legfelső elemét. Ez a verem legújabb eleme. A verem mérete az eltávolítás után 1-gyel csökken. A függvény szintaxisa a következő:

stack.pop()

A függvény nem vesz fel paramétereket.

Példa 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() és pop()

Itt van egy képernyőkép a kódról:

push() és pop()

Code Magyarázat:

  1. Szerelje be az iostream fejlécfájlt a kódunkba a funkcióinak használatához.
  2. Szerelje be a verem fejlécfájlját a kódunkba a funkcióinak használatához.
  3. Szerelje be az std névteret a kódunkba, hogy az osztályait hívás nélkül használhassa.
  4. Hívja meg a main() függvényt. A program logikáját hozzá kell adni ebben a függvényben.
  5. Hozzon létre egy st verem az egész értékek tárolására.
  6. A push() függvény segítségével illessze be a 10-es értéket a verembe.
  7. A push() függvény segítségével illessze be a 20-es értéket a verembe.
  8. A push() függvény segítségével illessze be a 30-es értéket a verembe.
  9. A push() függvény segítségével illessze be a 40-es értéket a verembe.
  10. A pop() függvénnyel távolítsa el a veremből a legfelső elemet, azaz a 40-at. A felső elem mostantól 30 lesz.
  11. A pop() függvénnyel távolítsa el a veremből a legfelső elemet, azaz a 30-at. A felső elem mostantól 20 lesz.
  12. Használja a while ciklust és az üres() függvényt annak ellenőrzésére, hogy a verem NEM üres-e. A ! a NOT operátor.
  13. A verem aktuális tartalmának kinyomtatása a konzolon.
  14. Hívja meg a pop() függvényt a veremben.
  15. A while ciklus törzsének vége.
  16. A main() függvénytörzs vége.

üres(), méret(), felső()

A veremek beépített funkciókkal rendelkeznek, amelyek segítségével játszhatsz a veremmel és annak értékeivel. Ezek tartalmazzák:

  • üres()– ellenőrzi, hogy egy verem üres-e vagy sem.
  • méret ()– visszaadja a verem méretét, azaz a veremben lévő elemek számát.
  • top ()– a legfelső veremelemhez fér hozzá.

Példa 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:

üres(), méret(), felső()

Itt van egy képernyőkép a kódról:

üres(), méret(), felső()

Code Magyarázat:

  1. Szerelje be az iostream fejlécfájlt a kódunkba a funkcióinak használatához.
  2. Szerelje be a verem fejlécfájlját a kódunkba, hogy használni tudja a funkcióit.
  3. Szerelje be az std névteret a programunkba, hogy az osztályait hívás nélkül használhassa.
  4. Hozzuk létre a createStack függvényt, amellyel létrehozhatjuk a verem mystacket. A verem egész számokat tartalmaz.
  5. A createStack függvény törzsének eleje.
  6. Hozzon létre egy példányt a mystack adattípusból, és adja meg az ms nevet.
  7. Használja a while ciklust és az üres() függvényt annak ellenőrzésére, hogy a verem üres-e.
  8. A while ciklus törzsének kezdete.
  9. Használja a verem tetején tárolt top() függvényt. A \t karakter új lapot hoz létre.
  10. A pop() függvénnyel törölheti a verem tetején lévő elemet.
  11. A while ciklus törzsének vége.
  12. Nyomtasson egy üres sort a konzolra.
  13. A createStack függvény törzsének vége.
  14. Hívja meg a main() függvényt. A program logikáját hozzá kell adni a main() függvény törzséhez.
  15. A main() függvény törzsének kezdete.
  16. Hozzon létre egy verem objektumot st.
  17. A push() függvény segítségével illessze be a 32-es elemet a verembe.
  18. A push() függvény segítségével illessze be a 21-es elemet a verembe.
  19. A push() függvény segítségével illessze be a 39-es elemet a verembe.
  20. A push() függvény segítségével illessze be a 89-es elemet a verembe.
  21. A push() függvény segítségével illessze be a 25-es elemet a verembe.
  22. Nyomtasson szöveget a konzolra.
  23. Hívja a createStack függvényt a fenti beszúrási műveletek végrehajtásához a verembe.
  24. Nyomtassa ki a köteg méretét a konzolon a többi szöveg mellé.
  25. Nyomtassa ki a konzolon lévő köteg tetején lévő elemet.
  26. Nyomtasson szöveget a konzolra.
  27. Törölje a verem tetején lévő elemet. Ezután visszaadja a veremben maradt elemeket.
  28. Hívja a createStack függvényt a fenti műveletek végrehajtásához.
  29. A programnak értéket kell visszaadnia a sikeres befejezés után.
  30. A main() függvény törzsének vége.

emplace() és swap()

Ezek további beépített veremfunkciók:

  • tüzelőállásba hoz()– a konstrukciók ezután egy új elemet szúrnak be a verem tetejére.
  • csere()– kicseréli a verem tartalmát egy másik verem tartalmával.

Példa 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() és swap()

Itt van egy képernyőkép a kódról:

emplace() és swap()

Code Magyarázat:

  1. Szerelje be az iostream fejlécfájlt a kódunkba a funkcióinak használatához.
  2. Szerelje be a verem fejlécfájlját a kódunkba a funkcióinak használatához.
  3. Szerelje be a cstdlib fejlécfájlt a kódunkba a funkcióinak használatához.
  4. Szerelje be az std névteret a kódunkba, hogy az osztályait hívás nélkül használhassa.
  5. Hívja meg a main() függvényt. A program logikája bekerül a függvény törzsébe.
  6. Deklaráljon egy st1 nevű veremet az egész értékek tárolására.
  7. Deklaráljon egy st2 nevű veremet az egész értékek tárolására.
  8. Használja az emplace() függvényt a 12 egész szám beszúrásához az st1 nevű verembe.
  9. Használja az emplace() függvényt a 19 egész szám beszúrásához az st1 nevű verembe.
  10. Használja az emplace() függvényt a 20 egész szám beszúrásához az st2 nevű verembe.
  11. Használja az emplace() függvényt a 23 egész szám beszúrásához az st2 nevű verembe.
  12. A swap() függvény segítségével felcserélheti a két verem, az st1 és az st2 tartalmát. Az st1 verem tartalmát át kell helyezni az st2 verembe. Az st2 verem tartalmát át kell helyezni az st1 verembe.
  13. Nyomtasson szöveget a konzolra.
  14. Használja a while utasítást és az üres() függvényt annak ellenőrzésére, hogy az st1 verem nem üres-e.
  15. Nyomtassa ki az st1 verem tartalmát a konzolon. A konzolra való nyomtatáskor a " " helyet ad a veremelemek között.
  16. Hajtsa végre a pop() függvényt az st1 veremben a felső elem eltávolításához.
  17. A while utasítás törzsének vége.
  18. Nyomtasson szöveget a konzolra. A endl egy C++ kulcsszó a végsorhoz. Az egérkurzort a következő sorra mozgatja, hogy onnan kezdje meg a nyomtatást.
  19. Használja a while utasítást és az üres() függvényt annak ellenőrzésére, hogy az st2 verem nem üres-e.
  20. Nyomtassa ki az st2 verem tartalmát a konzolon. A konzolra való nyomtatáskor a " " helyet ad a veremelemek között.
  21. Hajtsa végre a pop() függvényt az st2 veremben a felső elem eltávolításához.
  22. A while utasítás törzsének vége.
  23. A main() függvény törzsének vége.

Stack STL-ben

Az STL (Standard Template Library) sablonosztályokkal rendelkezik, amelyek közös C++ adatstruktúrák. Ezért egy verem STL-ben is megvalósítható. Egyszerűen beépítjük ezt a könyvtárat a kódunkba, és egy verem meghatározására használjuk.

stack<T> st; 

A fenti szintaxis egy st verem deklarálja a T adattípusú elemeket.

Példa 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:

Stack STL-ben

Itt van egy képernyőkép a kódról:

Stack STL-ben

Code Magyarázat:

  1. Szerelje be az iostream fejlécfájlt a kódunkba a funkcióinak használatához.
  2. Szerelje be a verem fejlécfájlját a kódunkba a funkcióinak használatához.
  3. Szerelje be a cstdlib fejlécfájlt a kódunkba a funkcióinak használatához.
  4. Szerelje be az std névteret a kódunkba, hogy az osztályait hívás nélkül használhassa.
  5. Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
  6. Deklaráljon egy verem st értéket az egész adatok tárolására.
  7. Adja hozzá a 12-es elemet a veremhez.
  8. Adja hozzá a 19-es elemet a veremhez.
  9. Adja hozzá a 20-es elemet a veremhez.
  10. Nyomtassa ki a konzolon lévő köteg tetején lévő elemet.
  11. Nyomtassa ki a köteg méretét a konzolra.
  12. A main() függvény törzsének vége.

GYIK

Egy verem az Utolsóként be, elsőként ki sorrendet követi, tehát először a legújabb elemet távolítja el. Egy sor az Elsőként be, elsőként ki sorrendet követi, tehát először a legrégebbi elemet távolítja el. Mindegyik más feldolgozási igényt elégít ki.

Igen. Az std::stack bármilyen szekvenciatárolót elfogad második sablonargumentumként, például az std::stack-et. >. Az alapértelmezett deque a legtöbb esetben megfelel, míg a vector javíthatja a memória lokalitását, amikor a verem kiszámíthatóan növekszik.

Mind a push, mind a pop függvény konstans O(1) idő alatt fut, mivel a verem csak a legfelső elemét érinti. Az alapul szolgáló deque függvény a meglévő elemek eltolása nélkül ad hozzá elemeket, így a teljesítmény a verem méretétől függetlenül kiszámítható marad.

Az std::stack nem tartalmaz iterátorokat, így egy tartományalapú ciklus nem fordul le. Minden érték beolvasásához másold le a veremet, és ismételten hívd meg a top() és pop() függvényeket a másolaton, vagy válassz egy deque-t, ha bejárás szükséges.

A pop() függvény tervezésénél fogva void értéket ad vissza, elkülönítve az eltávolítást a hozzáféréstől a kivételek biztonsága érdekében. Az egy lépésben történő olvasás és eltávolítás adatvesztést okozhat, ha a másolás hibát dob, ezért először a top() függvényt hívjuk meg, majd a pop() függvényt.

Nem. Az std::stack nem kínál beépített szinkronizációt, így a több szálból érkező egyidejű push és pop hívások adatversenyt okoznak. Védje a megosztott hozzáférést mutex-szel vagy más zárolási mechanizmussal, mielőtt egyetlen vermet használna a szálak között.

Igen. A mesterséges intelligenciával működő kódolóasszisztensek beolvasnak egy megjegyzést vagy függvénynevet, és std::stack deklarációkat, push és pop ciklusokat, valamint bejárási logikát hoznak létre. RevA generált határellenőrzések, például az üres() tesztek megtekintése a pop() függvény futtatása előtt továbbra is fontos a biztonságos programok szempontjából.

Igen. GitHub másodpilóta gépelés közben végrehajtja a push, pop, top és empty() hívásokat, és javaslatokat tesz a konténerválasztásra. Ez 2026. C++ A kódintelligencia szimbólumfelismerést biztosít, így a többfájlos veremjavaslatok konzisztensek maradnak.

Foglald össze ezt a bejegyzést a következőképpen: