C# Stack s příklady Push & Pop
⚡ Chytré shrnutí
Stack v jazyce C# je kolekce z oboru názvů System.Collections, která se řídí principem LIFO (last in, first out), kde metoda Push přidá prvek na začátek a metoda Pop ho odebere.

Co je Stack v C#?
Zásobník je speciální kolekce případů, která představuje koncept LIFO (poslední dovnitř první ven). Abychom nejprve pochopili LIFO, uveďme si příklad. Představte si stoh knih s každou knihou uloženou na sobě.
Koncept posledního dovnitř první ven v případě knih znamená, že ze stohu knih lze odstranit pouze knihu, která je nejvíce nahoře. Není možné vyjmout knihu z mezi, protože by to narušilo nastavení stohu.
Proto v C#, zásobník také funguje stejným způsobem. Prvky jsou přidány do zásobníku, jeden na druhém. Proces přidávání prvku do zásobníku se nazývá operace push. Chcete-li odstranit prvek z balíčku, můžete také odstranit nejvrchnější prvek balíčku. Tato operace je známá jako pop.
Podívejme se na operace dostupné pro kolekci Stack podrobněji.
Prohlášení o stohu
Zásobník je vytvořen pomocí typu Stack Data. Klíčové slovo „new“ se používá k vytvoření objektu zásobníku. Objekt je pak přiřazen k proměnné st.
Stack st = new Stack()
Přidávání prvků do zásobníku
Metoda push se používá k přidání prvku do zásobníku. Obecná syntaxe příkazu je uvedena níže.
Stack.push(element)
Odebrání prvků ze zásobníku
Metoda pop se používá k odstranění prvku ze zásobníku. Operace pop vrátí nejvyšší prvek zásobníku. Obecná syntaxe příkazu je uvedena níže
Stack.pop()
Počítat
Tato vlastnost se používá k získání počtu položek v zásobníku. Níže je obecná syntaxe tohoto příkazu.
Stack.Count
obsahuje
Tato metoda se používá ke zjištění, zda je prvek přítomen v zásobníku. Níže je obecná syntaxe tohoto příkazu. Příkaz vrátí true, pokud prvek existuje, jinak vrátí hodnotu false.
Stack.Contains(element)
Nyní se podívejme, jak to funguje na úrovni kódu. Všechny níže uvedené kódy budou zapsány do našeho Konzolová aplikace. Kód bude zapsán do našeho souboru Program.cs.
V níže uvedeném programu napíšeme kód, abychom viděli, jak můžeme použít výše uvedené metody.
Příklad 1: Metoda Stack.Push().
V tomto příkladu uvidíme
- Jak se vytvoří zásobník.
- Jak zobrazit prvky zásobníku a používat metody Count a Contain.
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DemoApplication { class Program { static void Main(string[] args) { Stack st = new Stack(); st.Push(1); st.Push(2); st.Push(3); foreach (Object obj in st) { Console.WriteLine(obj); } Console.WriteLine(); Console.WriteLine(); Console.WriteLine("The number of elements in the stack " +st.Count); Console.WriteLine("Does the stack contain the elements 3 "+st.Contains(3)); Console.ReadKey(); } } }
Code Vysvětlení:-
- První krok slouží k deklaraci zásobníku. Zde deklarujeme „st“ jako proměnnou pro uložení prvků našeho zásobníku.
- Dále do našeho zásobníku přidáme 3 prvky. Každý prvek je přidán pomocí metody Push.
- Nyní, protože prvky zásobníku nelze přistupovat přes pozici indexu, jako je seznam polí, musíme použít jiný přístup k zobrazení prvků zásobníku. Objekt (obj) je dočasná proměnná, která je deklarována pro každý prvek zásobníku. Poté pomocí příkazu foreach projdeme každý prvek zásobníku. Pro každý prvek zásobníku je hodnota přiřazena proměnné obj. Poté pomocí příkazu Console.Writeline zobrazíme hodnotu do konzole.
- Používáme vlastnost Count (st.count), abyste získali počet položek v zásobníku. Tato vlastnost vrátí číslo. Tuto hodnotu pak zobrazíme konzoli.
- Pak použijeme metodu Contains, abychom zjistili, zda je v našem zásobníku přítomna hodnota 3. To vrátí hodnotu true nebo false. Tuto návratovou hodnotu pak zobrazíme konzoli.
Pokud je výše uvedený kód zadán správně a program je spuštěn, zobrazí se následující výstup.
Výstup:
Z výstupu vidíme, že jsou zobrazeny prvky zásobníku. Také se zobrazí hodnota True, která říká, že v zásobníku je definována hodnota 3.
Hodnocení: Všimli jste si, že poslední prvek vložený do zásobníku se zobrazuje jako první. Toto je nejvyšší prvek zásobníku. Počet prvků zásobníku je také uveden ve výstupu.
Příklad 2: Metoda Stack.Pop().
Nyní se podívejme na funkci „odebrat“. Uvidíme kód potřebný k odstranění nejvyššího prvku ze zásobníku.
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DemoApplication { class Program { static void Main(string[] args) { Stack st = new Stack(); st.Push(1); st.Push(2); st.Push(3); st.Pop(); foreach (Object obj in st) { Console.WriteLine(obj); } Console.ReadKey(); } } }
Code Vysvětlení:-
- Zde pouze vydáváme metodu pop, která se používá k odstranění prvku ze zásobníku.
Pokud je výše uvedený kód zadán správně a program je spuštěn, zobrazí se následující výstup.
Výstup:
Můžeme vidět, že prvek 3 byl odstraněn ze zásobníku.
Metoda C# Stack Peek()
Metody Push a Pop pracují s vrcholem zásobníku, ale někdy stačí podívat se pouze na nejvyšší prvek, aniž byste ho museli odstranit. Metoda Peek dělá přesně totéž. Vrací nejvyšší hodnotu zásobníku a ponechává kolekci beze změny, což je užitečné, když chcete otestovat další položku, než se rozhodnete ji odebrat.
Krok 1) Vytvořte zásobník a vložte na něj tři prvky tak, aby hodnota 3 byla nahoře.
Krok 2) Zavolejte metodu Peek pro čtení nejvyššího prvku a poté zkontrolujte vlastnost Count, abyste se ujistili, že nic nebylo odstraněno.
using System; using System.Collections; namespace DemoApplication { class Program { static void Main(string[] args) { Stack st = new Stack(); st.Push(1); st.Push(2); st.Push(3); Console.WriteLine(st.Peek()); Console.WriteLine(st.Count); Console.ReadKey(); } } }
Code Vysvětlení:-
- Je deklarován zásobník s názvem st a hodnoty 1, 2 a 3 jsou sečteny pomocí metody Push, takže 3 se stane nejvyšším prvkem.
- Metoda Peek vrací nejvyšší prvek bez jeho odebrání a vlastnost Count stále hlásí plný počet položek v zásobníku.
Když se program spustí, vypíše hodnotu 3 od Peeka a pak od počtu 3, což dokazuje, že prvek zůstává na zásobníku. Pokud je zásobník prázdný, Peek vyvolá chybu Invalid.OperationException, takže je bezpečné zkontrolovat Count před jeho voláním.
Generický zásobník v C#
Výše uvedené příklady používají negenerickou třídu Stack ze System.Collections, která ukládá každý prvek jako objekt. Moderní kód v C# obvykle preferuje generickou třídu Stack. třída z oboru názvů System.Collections.Generic. Váže zásobník k jednomu deklarovanému typu, takže kompilátor kontroluje každý Push a Pop a není potřeba žádné přetypování ani zabalování.
Klíčové výhody generického Stacku jsou uvedeny níže.
- Bezpečnost typů: Typ je pevně stanoven při deklaraci, takže lze vkládat pouze hodnoty daného typu a chyby se zachycují při kompilaci.
- Žádný box: Typy hodnot, jako například int, se ukládají přímo, což eliminuje náklady na ukládání, které platí negenerický Stack.
- Čistič čte: Funkce Pop a Peek vracejí deklarovaný typ přímo, takže se výsledek nepřetypuje zpět z objektu.
using System; using System.Collections.Generic; namespace DemoApplication { class Program { static void Main(string[] args) { Stack<string> st = new Stack<string>(); st.Push("Java"); st.Push("Python"); Console.WriteLine(st.Pop()); Console.ReadKey(); } } }
V tomto příkladu je zásobník deklarován jako Stack , takže přijímá pouze řetězcové hodnoty. Metoda Pop vrací řetězec přímo a vypíše Python, poslední odeslaná hodnota. Pro každý nový projekt, generický Stack je doporučená volba.
Rozdíl mezi zásobníkem a frontou v C#
Zásobník a fronta jsou obě kolekce, které řídí pořadí, ve kterém jsou prvky odstraňovány, ale používají opačná pravidla. Zásobník je definován jako poslední dovnitř, první ven, zatímco fronta je definována jako první dovnitř, první ven. Výběr správné kolekce objasní záměr vašeho kódu ostatním vývojářům.
Hlavní rozdíly jsou uvedeny níže:
- Pořadí: Zásobník nejprve odstraní naposledy přidaný prvek (LIFO), zatímco fronta nejprve odstraní nejstarší prvek (FIFO).
- Metody: Zásobník používá Push a Pop, zatímco fronta používá Enqueue pro přidávání a Dequeue pro odebírání.
- Přístup k nejvyššímu prvku: Zásobník čte svou další položku pomocí funkce Peek a fronta čte svou další položku pomocí funkce Peek zepředu.
- Typické použití: Zásobníky vyhovují funkcím undo, vyhodnocování výrazů a rekurzi trackrál, zatímco fronty se hodí pro plánování, ukládání do vyrovnávací paměti a procházení do šířky.
Oba typy jsou k dispozici v obecné formě jako Stack. a fronta v System.Collections.Generic, takže s oběma možnostmi získáte typovou bezpečnost.




