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.

  • ???? Koncept LIFO: Zásobník funguje jako hromada knih, takže poslední prvek, který se posune, je první, který se odstraní.
  • Zatlač a vyskoč: Metoda Push přidá prvek na začátek zásobníku a metoda Pop tento nejvyšší prvek odebere a vrátí.
  • 👀 Nahlédnout, spočítat, obsahuje: Metoda Peek přečte nejvyšší prvek bez jeho odstranění, zatímco metody Count a Contains uvádějí velikost a členství.
  • 🧪 Zpracované příklady: Dva konzolové programy demonstrují Push s Count a Contains a poté Pop, takže můžete trace příkaz LIFO.
  • 🛠️ Generický zásobník: Zásobník Třída v System.Collections.Generic přidává bezpečnost typů během kompilace a zabraňuje zabalení pro nový kód C#.
  • 🤖 Asistence AI: GitHub Copilot scaffoldinguje operace C# Stack a ML.NET čte data prostřednictvím typovaných kolekcí namísto negenerického zásobníku.

C# Stack

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.

Zásobník v C#

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

  1. První krok slouží k deklaraci zásobníku. Zde deklarujeme „st“ jako proměnnou pro uložení prvků našeho zásobníku.
  2. Dále do našeho zásobníku přidáme 3 prvky. Každý prvek je přidán pomocí metody Push.
  3. 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.
  4. 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.
  5. 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ásobník v C#

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.

Zásobník v C#

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

  1. 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:

Zásobník v C#

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

  1. 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.
  2. 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.

Nejčastější dotazy

Volání Pop nebo Peek na prázdném zásobníku vyvolá chybu Invalid.OperationException. Nejprve zkontrolujte vlastnost Count nebo použijte generické metody Stack TryPop a TryPeek, které vracejí hodnotu false namísto vyvolání, když zásobník neobsahuje žádné prvky.

Funkce Push i Pop běží v konstantním čase O(1), protože se dotýkají pouze vrcholu zásobníku. Když se vnitřní pole musí zvětšit, občasná funkce Push změní jeho velikost, ale průměrné náklady na operaci zůstávají konstantní.

Ne. Zásobník zpřístupňuje prostřednictvím funkcí Peek a Pop pouze svůj vrchol, takže nemá žádný indexový přístupový objekt jako seznam. Chcete-li číst každou hodnotu, vyjmenujte zásobník pomocí smyčky foreach nebo jej zkopírujte pomocí metody ToArray.

Metoda Clear odstraní všechny prvky ze zásobníku jedním voláním a vynuluje Count na nulu. Chcete-li odstraňovat položky jednu po druhé od začátku, zavolejte metodu Pop ve smyčce, dokud Count nedosáhne nuly.

Standardní třída Stack není bezpečná pro zápisy z více vláken najednou. Pro souběžný přístup použijte ConcurrentStack z System.Collections.Concurrent, která nabízí atomické metody TryPush a TryPop bez externích zámků.

Voláním metody ToArray zkopírujete zásobník do nového pole, seřazeného odshora dolů. Zásobník můžete také předat konstruktoru List a vytvořit tak generický seznam, zatímco kee...ping stejném pořadí.

Ano. GitHub Copilot píše deklarace Stacku, volání Push a Pop a smyčky foreach z krátkého komentáře nebo názvu metody. Často navrhuje generickou verzi Stacku, protože to je doporučená kolekce pro nový kód C#.

Zásobníky zřídka ukládají trénovací data ML.NET, která procházejí typovanými kolekcemi a kanálem IDataView. Koncept zásobníku LIFO se však objevuje v algoritmech strojového učení pro zpětné vazby.trackrál, prohledávání do hloubky a správa rekurzivních volání metod.

Shrňte tento příspěvek takto: