Naskládejte se C++ STL s příkladem
Co je std::stack?
Zásobník je datová struktura, která funguje na základě techniky LIFO (Last In First Out). Stack std::stack umožňuje přidávat a odebírat prvky pouze z jednoho konce.
Třída std::stack je adaptér kontejneru. Kontejnerové objekty obsahují data podobného datového typu. Zásobník můžete vytvořit z různých sekvenčních kontejnerů. Pokud není zadán žádný kontejner, bude ve výchozím nastavení použit kontejner deque. Adaptéry kontejnerů nepodporují iterátory, takže je nelze použít k manipulaci s daty.
Syntaxe zásobníku
Abychom vytvořili zásobník, musíme zahrnout hlavičkový soubor v našem kódu. Tuto syntaxi pak použijeme k definování std::stack:
template <class Type, class Container = deque<Type> > class stack;
- Typ – je typ prvku obsaženého v std::stack. Může být jakákoli platná C++ typu nebo dokonce uživatelem definovaný typ.
- Kontejner – je typ podkladového objektu kontejneru.
Typy členů
Zde jsou typy členů zásobníku:
- value_type- První parametr šablony, T. Označuje typy prvků.
- container_type- Druhý parametr šablony, kontejner. Označuje základní typ kontejneru.
- size_type- Integrální typ bez znaménka.
Operav Stack
A C++ stack podporuje následující základní operace:
- push – Přidá/vloží položku do zásobníku.
- pop – Odebere/vytáhne položku ze zásobníku.
- peek – Vrátí horní položku ze zásobníku, aniž by ji odstranil.
- isFull – Zkontroluje, zda je zásobník plný.
- isEmpty – Zkontroluje, zda je zásobník prázdný.
Implementace zásobníku
Krok 1) Na začátku máme prázdný zásobník. Horní část prázdného zásobníku je nastavena na -1.
Krok 2) Dále jsme vložili prvek 5 do zásobníku. Horní část zásobníku bude ukazovat na prvek 5.
Krok 3) Dále jsme zatlačili prvek 50 do stohu. Horní část zásobníku se posune a ukazuje na prvek 50.
Krok 4) Poté jsme provedli operaci pop a odstranili horní prvek ze zásobníku. Prvek 50 je vytažen ze stohu. Horní část zásobníku nyní ukazuje na prvek 5.
push() a pop()
Funkce stack::push() přidá novou položku na vrchol zásobníku. Velikost zásobníku se po vložení zvětší o 1. Funkce má tuto syntaxi:
stack.push(value)
Hodnota je položka, která se má vložit do zásobníku.
Funkce stack:: pop() odstraní horní prvek zásobníku. Toto je nejnovější položka ze zásobníku. Velikost stohu se po odebrání zmenší o 1. Zde je syntaxe funkce:
stack.pop()
Funkce nemá žádné parametry.
Příklad 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ýstup:
Zde je snímek obrazovky kódu:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte do našeho kódu hlavičkový soubor iostream.
- Chcete-li používat jeho funkce, zahrňte do našeho kódu soubor záhlaví zásobníku.
- Zahrňte do našeho kódu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
- Zavolejte funkci main(). Do této funkce by měla být přidána programová logika.
- Vytvořte zásobník st pro uložení celočíselných hodnot.
- Pomocí funkce push() vložte hodnotu 10 do zásobníku.
- Pomocí funkce push() vložte hodnotu 20 do zásobníku.
- Pomocí funkce push() vložte hodnotu 30 do zásobníku.
- Pomocí funkce push() vložte hodnotu 40 do zásobníku.
- Pomocí funkce pop() odeberte horní prvek ze zásobníku, tedy 40. Horní prvek se nyní změní na 30.
- Pomocí funkce pop() odeberte horní prvek ze zásobníku, tedy 30. Horní prvek se nyní změní na 20.
- Použijte cyklus while a funkci empty() ke kontrole, zda zásobník NENÍ prázdný. ! je operátor NOT.
- Tisk aktuálního obsahu zásobníku na konzole.
- Zavolejte funkci pop() na zásobníku.
- Konec těla smyčky while.
- Konec těla funkce main().
empty(), size(), top()
Zásobníky mají vestavěné funkce, které můžete použít k hraní si se zásobníkem a jeho hodnotami. Tyto zahrnují:
- empty()- zkontroluje, zda je zásobník prázdný nebo ne.
- size()- vrací velikost zásobníku, tedy počet prvků v zásobníku.
- top()- přistupuje k prvku zásobníku nahoře.
Příklad 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ýstup:
Zde je snímek obrazovky kódu:
Vysvětlení kódu:
- Zahrňte hlavičkový soubor iostream do našeho kódu, abyste mohli používat jeho funkce.
- Zahrňte do našeho kódu soubor záhlaví zásobníku, abyste mohli používat jeho funkce.
- Zahrňte do našeho programu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
- Vytvořte funkci createStack, kterou můžeme použít k vytvoření zásobníku mystack. Zásobník bude obsahovat sadu celých čísel.
- Začátek těla funkce createStack.
- Vytvořte instanci datového typu mystack a pojmenujte ji ms.
- Pomocí cyklu while a funkce empty() zkontrolujte, zda je zásobník prázdný.
- Začátek těla smyčky while.
- Použijte funkci top() uloženou v horní části zásobníku. Znak \t vytvoří novou kartu.
- Pomocí funkce pop() odstraňte prvek v horní části zásobníku.
- Konec těla smyčky while.
- Vytiskněte na konzole prázdný řádek.
- Konec těla funkce createStack.
- Zavolejte funkci main(). Logika programu by měla být přidána do těla funkce main().
- Začátek těla funkce main().
- Vytvořte objekt zásobníku st.
- Pomocí funkce push() vložte prvek 32 do zásobníku.
- Pomocí funkce push() vložte prvek 21 do zásobníku.
- Pomocí funkce push() vložte prvek 39 do zásobníku.
- Pomocí funkce push() vložte prvek 89 do zásobníku.
- Pomocí funkce push() vložte prvek 25 do zásobníku.
- Vytiskněte nějaký text na konzoli.
- Chcete-li provést výše uvedené operace vložení do zásobníku, zavolejte funkci createStack.
- Vytiskněte velikost stohu na konzole vedle jiného textu.
- Vytiskněte prvek v horní části zásobníku na konzole.
- Vytiskněte nějaký text na konzoli.
- Odstraňte prvek v horní části zásobníku. Poté vrátí prvky zbývající v zásobníku.
- Chcete-li provést výše uvedené operace, zavolejte funkci createStack.
- Program musí po úspěšném dokončení vrátit hodnotu.
- Konec těla funkce main().
emplace() a swap()
Toto jsou další vestavěné funkce zásobníku:
- emplace()- konstrukty pak vloží nový prvek na vrchol zásobníku.
- swap()- vymění obsah zásobníku za obsah jiného zásobníku.
Příklad 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ýstup:
Zde je snímek obrazovky kódu:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte do našeho kódu hlavičkový soubor iostream.
- Chcete-li používat jeho funkce, zahrňte do našeho kódu soubor záhlaví zásobníku.
- Chcete-li používat jeho funkce, zahrňte do našeho kódu hlavičkový soubor cstdlib.
- Zahrňte do našeho kódu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
- Zavolejte funkci main(). Programová logika bude přidána do těla této funkce.
- Deklarujte zásobník s názvem st1 pro ukládání celočíselných hodnot.
- Deklarujte zásobník s názvem st2 pro ukládání celočíselných hodnot.
- Pomocí funkce emplace() vložte celé číslo 12 do zásobníku s názvem st1.
- Pomocí funkce emplace() vložte celé číslo 19 do zásobníku s názvem st1.
- Pomocí funkce emplace() vložte celé číslo 20 do zásobníku s názvem st2.
- Pomocí funkce emplace() vložte celé číslo 23 do zásobníku s názvem st2.
- Pomocí funkce swap() zaměňte obsah dvou zásobníků, st1 a st2. Obsah zásobníku st1 by se měl přesunout do zásobníku st2. Obsah zásobníku st2 by se měl přesunout do zásobníku st1.
- Vytiskněte nějaký text na konzoli.
- Pomocí příkazu while a funkce empty() zkontrolujte, zda není zásobník st1 prázdný.
- Vytiskněte obsah zásobníku st1 na konzole. „ “ přidává mezeru mezi prvky zásobníku při jejich tisku na konzole.
- Spusťte funkci pop() na zásobníku st1, abyste odstranili horní prvek.
- Konec těla příkazu while.
- Vytiskněte nějaký text na konzoli. Konec je a C++ klíčové slovo pro koncový řádek. Přesune kurzor myši na další řádek a začne tisknout odtud.
- Pomocí příkazu while a funkce empty() zkontrolujte, zda není zásobník st2 prázdný.
- Vytiskněte obsah zásobníku st2 na konzole. „ “ přidává mezeru mezi prvky zásobníku při jejich tisku na konzole.
- Spusťte funkci pop() na zásobníku st2, abyste odstranili horní prvek.
- Konec těla příkazu while.
- Konec těla funkce main().
Zásobník v STL
STL (Standard Template Library) přichází s třídami šablon, které poskytují společné C++ datové struktury. Proto lze zásobník implementovat i v STL. Tuto knihovnu jednoduše zahrneme do našeho kódu a použijeme ji k definování zásobníku.
stack<T> st;
Výše uvedená syntaxe deklaruje stack st k prvkům datového typu T.
Příklad 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ýstup:
Zde je snímek obrazovky kódu:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte do našeho kódu hlavičkový soubor iostream.
- Chcete-li používat jeho funkce, zahrňte do našeho kódu soubor záhlaví zásobníku.
- Chcete-li používat jeho funkce, zahrňte do našeho kódu hlavičkový soubor cstdlib.
- Zahrňte do našeho kódu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
- Zavolejte funkci main(). Programová logika by měla být přidána do těla této funkce.
- Deklarujte stack st pro ukládání celočíselných dat.
- Přidejte prvek 12 do zásobníku.
- Přidejte prvek 19 do zásobníku.
- Přidejte prvek 20 do zásobníku.
- Vytiskněte prvek v horní části zásobníku na konzole.
- Vytiskněte velikost stohu na konzole.
- Konec těla funkce main().
Shrnutí
- Zásobník je datová struktura, která funguje na základě techniky LIFO (Last In First Out).
- Zásobník std::stack umožňuje přidávat a odebírat položky pouze z jednoho konce.
- Třída std::stack je kontejnerový adaptér, který obsahuje položky podobného datového typu.
- Zásobník lze vytvořit z různých sekvenčních kontejnerů.
- Pokud kontejner nezadáte, bude ve výchozím nastavení použit kontejner deque.
- Funkce push() slouží k vkládání položek do zásobníku.
- Funkce pop() slouží k odstranění horní položky z kroku.
- Funkce empty() slouží ke kontrole, zda je zásobník prázdný nebo ne.