Rakd be C++ STL példával
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 tárolóobjektumok hasonló adattípusú adatokat tartalmaznak. Különféle sorozattárolókból hozhat létre veremeket. Ha nincs megadva tároló, akkor alapértelmezés szerint a deque contente lesz használatban. A tárolóadapterek 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:
- value_type- Az első sablonparaméter, T. Az elemtípusokat jelöli.
- container_type- A második sablonparaméter, a Container. Jelzi az alapul szolgáló tárolótípust.
- size_type- Előjel nélküli integrál típus.
Operaa Stackben
A C++ A verem a következő alapvető műveleteket támogatja:
- push – Egy elemet hozzáad/tol a verembe.
- pop – Eltávolít/feldob egy elemet a veremből.
- peek – A verem legfelső elemét adja vissza eltávolítása nélkül.
- isFull – Ellenőrzi, hogy egy verem megtelt-e.
- isEmpty – Ellenőrzi, hogy egy verem üres-e.
Stack megvalósítás
Step 1) Kezdetben van egy üres kötegünk. Egy üres verem teteje -1-re van állítva.
Step 2) Ezután az 5. elemet betoltuk a verembe. A köteg teteje az 5-ös elemre fog mutatni.
Step 3) Ezután az 50 elemet betoltuk a kötegbe. A verem teteje eltolódik, és az 50-es elemre mutat.
Step 4) Ezután végrehajtottunk egy pop műveletet, eltávolítva a felső elemet a veremből. Az 50 elem kikerül a kötegből. A verem teteje most az 5-ös elemre mutat.
push() és pop()
A verem::push() függvények új elemet adnak a verem tetejére. A verem mérete 1-gyel nő a beillesztés után. A függvény a következő szintaxist veszi fel:
stack.push(value)
Az érték a verembe beszúrandó elem.
A verem:: pop() függvény eltávolítja a verem legfelső elemét. Ez a verem legújabb eleme. Az eltávolítás után a köteg mérete 1-gyel csökken. Íme a függvény szintaxisa:
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:
Itt van egy képernyőkép a kódról:
Kód magyarázata:
- Szerelje be az iostream fejlécfájlt a kódunkba a funkcióinak használatához.
- Szerelje be a verem fejlécfájlját a kódunkba a funkcióinak használatához.
- Szerelje be az std névteret a kódunkba, hogy az osztályait hívás nélkül használhassa.
- Hívja meg a main() függvényt. A program logikáját hozzá kell adni ebben a függvényben.
- Hozzon létre egy st verem az egész értékek tárolására.
- A push() függvény segítségével illessze be a 10-es értéket a verembe.
- A push() függvény segítségével illessze be a 20-es értéket a verembe.
- A push() függvény segítségével illessze be a 30-es értéket a verembe.
- A push() függvény segítségével illessze be a 40-es értéket a verembe.
- A pop() függvénnyel távolítsa el a veremből a legfelső elemet, azaz a 40-et. A felső elem most 30 lesz.
- 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.
- 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.
- A verem aktuális tartalmának kinyomtatása a konzolon.
- Hívja meg a pop() függvényt a veremben.
- A while ciklus törzsének vége.
- 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.
- size()- a verem méretét adja vissza, vagyis a veremben lévő elemek számát.
- top()- eléri a verem elemet a tetején.
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:
Itt van egy képernyőkép a kódról:
Kód magyarázata:
- Szerelje be az iostream fejlécfájlt a kódunkba a funkcióinak használatához.
- Szerelje be a verem fejlécfájlját a kódunkba, hogy használni tudja a funkcióit.
- Szerelje be az std névteret a programunkba, hogy az osztályait hívás nélkül használhassa.
- Hozzuk létre a createStack függvényt, amellyel létrehozhatjuk a verem mystacket. A verem egész számokat tartalmaz.
- A createStack függvény törzsének eleje.
- Hozzon létre egy példányt a mystack adattípusból, és adja meg az ms nevet.
- Használja a while ciklust és az üres() függvényt annak ellenőrzésére, hogy a verem üres-e.
- A while ciklus törzsének kezdete.
- Használja a verem tetején tárolt top() függvényt. A \t karakter új lapot hoz létre.
- A pop() függvénnyel törölheti a verem tetején lévő elemet.
- A while ciklus törzsének vége.
- Nyomtasson egy üres sort a konzolra.
- A createStack függvény törzsének vége.
- Hívja meg a main() függvényt. A program logikáját hozzá kell adni a main() függvény törzséhez.
- A main() függvény törzsének kezdete.
- Hozzon létre egy verem objektumot st.
- A push() függvény segítségével illessze be a 32-es elemet a verembe.
- A push() függvény segítségével illessze be a 21-es elemet a verembe.
- A push() függvény segítségével illessze be a 39-es elemet a verembe.
- A push() függvény segítségével illessze be a 89-es elemet a verembe.
- A push() függvény segítségével illessze be a 25-es elemet a verembe.
- Nyomtasson szöveget a konzolra.
- Hívja a createStack függvényt a fenti beszúrási műveletek végrehajtásához a verembe.
- Nyomtassa ki a köteg méretét a konzolon a többi szöveg mellé.
- Nyomtassa ki a konzolon lévő köteg tetején lévő elemet.
- Nyomtasson szöveget a konzolra.
- Törölje a verem tetején lévő elemet. Ezután visszaadja a veremben maradt elemeket.
- Hívja a createStack függvényt a fenti műveletek végrehajtásához.
- A programnak értéket kell visszaadnia a sikeres befejezés után.
- A main() függvény törzsének vége.
emplace() és swap()
Ezek további beépített veremfunkciók:
- Az emplace()- megszerkeszti, majd új elemet szúr be a verem tetejére.
- swap() – 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:
Itt van egy képernyőkép a kódról:
Kód magyarázata:
- Szerelje be az iostream fejlécfájlt a kódunkba a funkcióinak használatához.
- Szerelje be a verem fejlécfájlját a kódunkba a funkcióinak használatához.
- Szerelje be a cstdlib fejlécfájlt a kódunkba a funkcióinak használatához.
- Szerelje be az std névteret a kódunkba, hogy az osztályait hívás nélkül használhassa.
- Hívja meg a main() függvényt. A program logikája bekerül a függvény törzsébe.
- Deklaráljon egy st1 nevű veremet az egész értékek tárolására.
- Deklaráljon egy st2 nevű veremet az egész értékek tárolására.
- Használja az emplace() függvényt a 12 egész szám beszúrásához az st1 nevű verembe.
- Használja az emplace() függvényt a 19 egész szám beszúrásához az st1 nevű verembe.
- Használja az emplace() függvényt a 20 egész szám beszúrásához az st2 nevű verembe.
- Használja az emplace() függvényt a 23 egész szám beszúrásához az st2 nevű verembe.
- 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.
- Nyomtasson szöveget a konzolra.
- 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.
- Nyomtassa ki az st1 verem tartalmát a konzolon. A konzolra való nyomtatáskor a " " helyet ad a veremelemek között.
- Hajtsa végre a pop() függvényt az st1 veremben a felső elem eltávolításához.
- A while utasítás törzsének vége.
- 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.
- 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.
- Nyomtassa ki az st2 verem tartalmát a konzolon. A konzolra való nyomtatáskor a " " helyet ad a veremelemek között.
- Hajtsa végre a pop() függvényt az st2 veremben a felső elem eltávolításához.
- A while utasítás törzsének vége.
- 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:
Itt van egy képernyőkép a kódról:
Kód magyarázata:
- Szerelje be az iostream fejlécfájlt a kódunkba a funkcióinak használatához.
- Szerelje be a verem fejlécfájlját a kódunkba a funkcióinak használatához.
- Szerelje be a cstdlib fejlécfájlt a kódunkba a funkcióinak használatához.
- Szerelje be az std névteret a kódunkba, hogy az osztályait hívás nélkül használhassa.
- Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
- Deklaráljon egy verem st értéket az egész adatok tárolására.
- Adja hozzá a 12-es elemet a veremhez.
- Adja hozzá a 19-es elemet a veremhez.
- Adja hozzá a 20-es elemet a veremhez.
- Nyomtassa ki a konzolon lévő köteg tetején lévő elemet.
- Nyomtassa ki a köteg méretét a konzolra.
- A main() függvény törzsének vége.
Összegzésként
- 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, amely hasonló adattípusú elemeket tartalmaz.
- Egy verem különböző sorozattárolókból hozható létre.
- Ha nem ad meg tárolót, a rendszer alapértelmezés szerint a visszavonási tárolót használja.
- A push() függvény arra szolgál, hogy elemeket helyezzen be a verembe.
- A pop() függvény a lépés legfelső elemének eltávolítására szolgál.
- Az üres() függvény annak ellenőrzésére szolgál, hogy egy verem üres-e vagy sem.