C# Stack Push & Pop példákkal

⚡ Okos összefoglaló

A C#-ban a Stack metódus a System.Collections névtér egy gyűjteménye, amely a LIFO (utoljára be, először ki) elvet követi, ahol a Push metódus hozzáad egy elemet a tetejéhez, a Pop metódus pedig eltávolítja azt.

  • ???? LIFO koncepció: Egy halom úgy működik, mint egy könyvkupac, tehát az utolsóként betolt elemet távolítjuk el először.
  • Nyomd és pattogtasd: A Push metódus hozzáad egy elemet a verem tetejéhez, a Pop metódus pedig eltávolítja és visszaadja a legfelső elemet.
  • 👀 Betekintés, Számolás, Tartalmazza: A Peek metódus a legfelső elemet olvassa be eltávolítás nélkül, míg a Count és a Contains metódusok a méretet és a tagságot jelentik.
  • 🧪 Működő példák: Két konzolos program bemutatja a Push függvényt Count és Contains függvényekkel, majd a Pop függvényt, így traca LIFO sorrend.
  • 🇧🇷 Általános verem: A verem A System.Collections.Generic mappában található osztály fordítási idejű típusbiztonságot biztosít, és elkerüli az új C# kód dobozolását.
  • 🤖 AI segítség: A GitHub Copilot C# Stack műveleteket támogat, az ML.NET pedig típusos gyűjteményeken keresztül olvassa az adatokat nem generikus verem helyett.

C# Stack

Mi a Stack a C#-ban?

A verem egy speciális esetgyűjtemény, amely a „last in first out” (LIFO) koncepciót képviseli. A LIFO megértéséhez vegyünk egy példát. Képzeljen el egy halom könyvet, amelyekben minden könyv egymás tetején van.

A könyvek esetében az „utolsó az első” koncepció azt jelenti, hogy csak a legfelső könyvet lehet eltávolítani a könyvkötegből. Nem lehet könyvet kivenni a kettő közül, mert akkor az megzavarná a köteg beállítását.

Ezért C#, a verem is ugyanúgy működik. Az elemek egymás tetejére kerülnek a verembe. Azt a folyamatot, amikor egy elemet hozzáadunk a veremhez, push műveletnek nevezzük. Elemnek a veremből való eltávolításához eltávolíthatja a verem legfelső elemét is. Ezt a műveletet popnak nevezik.

Nézzük meg részletesebben a Stack gyűjteményhez elérhető műveleteket.

Nyilatkozat a veremről

A verem a Stack Data típus segítségével jön létre. Az „új” kulcsszó egy verem objektumának létrehozására szolgál. Az objektumot ezután az st változóhoz rendeljük.

Stack st = new Stack()

Elemek hozzáadása a veremhez

A push módszerrel elemet adunk a veremhez. Az utasítás általános szintaxisa alább látható.

Stack.push(element)

Elemek eltávolítása a veremből

A pop módszerrel egy elemet távolítanak el a veremből. A pop művelet a verem legfelső elemét adja vissza. Az utasítás általános szintaxisa alább látható

 Stack.pop()

Gróf

Ez a tulajdonság a veremben lévő elemek számának lekérésére szolgál. Az alábbiakban ennek az állításnak az általános szintaxisa látható.

Stack.Count

tartalmaz

Ezzel a módszerrel ellenőrizhető, hogy van-e elem a veremben. Az alábbiakban ennek az állításnak az általános szintaxisa látható. Az utasítás igazat ad vissza, ha az elem létezik, ellenkező esetben false értéket ad vissza.

Stack.Contains(element)

Lássuk, hogyan működik ez kódszinten. Az alább említett kódok mindegyike meg lesz írva nekünk Konzol alkalmazás. A kód a Program.cs fájlunkba kerül.

Az alábbi programban megírjuk a kódot, hogy megnézzük, hogyan tudjuk használni a fent említett módszereket.

1. példa: Stack.Push() metódus

Ebben a példában látni fogjuk

  • Hogyan jön létre a verem.
  • A verem elemeinek megjelenítése, valamint a Count és Contain metódusok használata.

Verem a C#-ban

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 Magyarázat:-

  1. Az első lépés a verem deklarálására szolgál. Itt deklaráljuk az „st”-t változóként, amely a veremünk elemeit tárolja.
  2. Ezután hozzáadunk 3 elemet a veremünkhöz. Minden elem a Push módszerrel kerül hozzáadásra.
  3. Most mivel a veremelemek nem érhetők el az indexpozíción keresztül, mint a tömb lista, más megközelítést kell alkalmaznunk a verem elemeinek megjelenítéséhez. Az objektum (obj) egy ideiglenes változó, amely a verem minden elemének tárolására van deklarálva. Ezután a foreach utasítással végigmegyünk a verem egyes elemei között. Minden egyes veremelemnél az érték az obj változóhoz van rendelve. Ezután a Console.Writeline paranccsal jelenítjük meg az értéket a konzolon.
  4. A Count tulajdonságot használjuk (st.count), hogy megkapja a halomban lévő elemek számát. Ez a tulajdonság egy számot ad vissza. Ezután ezt az értéket megjelenítjük a konzolon.
  5. Ezután a Contains metódussal ellenőrizzük, hogy a 3-as érték jelen van-e a veremünkben. Ez igaz vagy hamis értéket ad vissza. Ezután ezt a visszatérési értéket megjelenítjük a konzolon.

Ha a fenti kódot megfelelően adta meg és a program lefut, a következő kimenet jelenik meg.

output:

Verem a C#-ban

A kimenetből láthatjuk, hogy a verem elemei megjelennek. A True értéke is megjelenik, jelezve, hogy a 3 érték a veremben van meghatározva.

Megjegyzések: Észrevette, hogy a verembe utoljára betolt elem jelenik meg először. Ez a verem legfelső eleme. A veremelemek száma is megjelenik a kimenetben.

2. példa: Stack.Pop() metódus

Most nézzük az „eltávolítás” funkciót. Látni fogjuk a legfelső elem veremből való eltávolításához szükséges kódot.

Verem a C#-ban

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 Magyarázat:-

  1. Itt csak a pop módszert adjuk ki, amely egy elem eltávolítására szolgál a veremből.

Ha a fenti kódot megfelelően beírta és a program lefut, a következő kimenet jelenik meg.

output:

Verem a C#-ban

Láthatjuk, hogy a 3. elemet eltávolították a veremből.

C# Stack Peek() metódus

A Push és Pop metódusok a verem tetejével dolgoznak, de néha csak a legfelső elemet kell megvizsgálni anélkül, hogy eltávolítanánk azt. A Peek metódus pontosan ezt teszi. Visszaadja a verem legfelső értékét, miközben a gyűjteményt változatlanul hagyja, ami akkor hasznos, ha a következő elemet tesztelni szeretnéd, mielőtt eldöntenéd, hogy ki szeretnéd-e venni.

Step 1) Hozz létre egy halmot, és helyezz rá három elemet úgy, hogy a 3-as érték kerüljön felülre.

Step 2) Hívd meg a Peek metódust a legfelső elem beolvasásához, majd ellenőrizd a Count tulajdonságot, hogy semmi sem lett-e eltávolítva.

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 Magyarázat:-

  1. Egy st nevű verem deklarálásra kerül, és az 1, 2 és 3 értékeket a Push metódussal összeadjuk, így a 3 lesz a legfelső elem.
  2. A Peek metódus a legfelső elemet adja vissza eltávolítás nélkül, a Count tulajdonság pedig továbbra is a veremben lévő elemek teljes számát jelenti.

Amikor a program fut, kiírja az értéket 3 Peek-től, majd a gróftól 3, ami bizonyítja, hogy az elem a veremben marad. Ha a verem üres, a Peek érvénytelen értéket dob.OperationException, így biztonságosan ellenőrizhetjük a Count értékét a hívás előtt.

Általános verem C#-ban

A fenti példák a System.Collections nem generikus Stack osztályát használják, amely minden elemet objektumként tárol. A modern C# kód általában az generikus Stack osztályt részesíti előnyben. osztály a System.Collections.Generic névtérből. Ez a verem egyetlen deklarált típushoz köti, így a fordító minden Push és Pop utasítást ellenőriz, és nincs szükség típusátalakításra vagy dobozolásra.

A generikus Stack legfontosabb előnyei alább felsorolva.

  • Típusbiztonság: A típus a deklarációnál rögzített, így csak az adott típusú értékek küldhetők be, és a hibákat fordítási időben észleli a rendszer.
  • Nincs boksz: Az olyan értéktípusok, mint az int, közvetlenül tárolódnak, így elkerülhető a nem generikus Stack által fizetendő dobozolási költség.
  • A tisztító ezt olvassa: A Pop és a Peek közvetlenül a deklarált típust adja vissza, így az eredményt nem kell visszakattintani az objektumból.
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();
  }
 }
}

Ebben a példában a verem Stack-ként van deklarálva. , tehát csak karakterlánc értékeket fogad el. A Pop metódus közvetlenül egy karakterláncot ad vissza, és kinyomtatja Python, az utolsóként beírt érték. Minden új projekt esetében az általános Stack az ajánlott választás.

Különbség a verem és a sor között C#-ban

Egy halom és egy sorban áll mindkettő olyan gyűjtemény, amely az elemek eltávolításának sorrendjét szabályozza, de ellentétes szabályokat alkalmaznak. Egy verem az utolsóként be, először ki, míg egy sor az elsőként be, először ki. A megfelelő kiválasztása egyértelművé teszi a kódod szándékát a többi fejlesztő számára.

A fő különbségek az alábbiakban felsorolva vannak:

  • Sorrend: Egy verem először a legutóbb hozzáadott elemet távolítja el (LIFO), míg egy sor a legrégebbi elemet távolítja el először (FIFO).
  • Módszerek: Egy verem Push és Pop metódusokat használ, míg egy sor az Enqueue metódust használja a hozzáadáshoz, a Dequeue metódust pedig az eltávolításhoz.
  • Felső szintű hozzáférés: Egy verem a Peek segítségével olvassa be a következő elemét, egy sor pedig a Peek segítségével olvassa be elölről a következő elemét.
  • Tipikus felhasználások: A veremekhez illeszkedő visszavonási funkciók, kifejezéskiértékelés és rekurzió trackirály, míg a várólisták illeszkednek az ütemezéshez, a puffereléshez és a szélesség-első bejáráshoz.

Mindkét típus generikus formában, Stack néven kapható. és a sor a System.Collections.Generic fájlban, így mindkét választási lehetőséggel típusbiztonságot kapsz.

GYIK

A Pop vagy Peek hívása üres verem esetén Érvénytelen hibát dob.OperationException. Először ellenőrizd a Count tulajdonságot, vagy használd az általános TryPop és TryPeek Stack metódusokat, amelyek hamis értéket adnak vissza a dobás helyett, ha a verem nem tartalmaz elemeket.

A Push és a Pop műveletek egyaránt konstans O(1) idő alatt futnak, mivel csak a verem tetejét érintik. Amikor a belső tömbnek növekednie kell, egy alkalmi Push átméretezi azt, de az átlagos műveletenkénti költség állandó marad.

Nem. Egy verem csak a tetejét teszi elérhetővé a Peek és Pop metódusokon keresztül, így nincs indexhozzáférése, mint egy listának. Az összes érték beolvasásához listázd a veremet egy foreach ciklussal, vagy másold ki a ToArray metódussal.

A Clear metódus egyetlen hívással eltávolítja az összes elemet a veremből, és visszaállítja a Count értékét nullára. Ha ehelyett felülről egyenként szeretné eltávolítani az elemeket, hívja meg a Pop metódust egy ciklusban, amíg a Count el nem éri a nullát.

A standard Stack osztály nem szálbiztos írás esetén, ha több szál egyszerre módosítja. Egyidejű hozzáféréshez használd a System.Collections.Concurrent ConcurrentStack osztályát, amely külső zárak nélküli atomi TryPush és TryPop metódusokat kínál.

A ToArray metódus meghívásával a verem egy új tömbbe másolható, felülről lefelé rendezett formában. A verem egy List konstruktornak is átadható, hogy egy általános listát hozzon létre, miközben keeping ugyanaz a sorrend.

Igen. A GitHub Copilot Stack deklarációkat, Push és Pop hívásokat, valamint foreach ciklusokat ír egy rövid megjegyzés vagy metódusnév alapján. Gyakran javasolja az általános Stack verziót, mivel ez az ajánlott gyűjtemény az új C# kódhoz.

A veremrendszerek ritkán tárolnak ML.NET betanítási adatokat, amelyek típusos gyűjteményeken és az IDataView folyamaton keresztül áramlanak. A LIFO verem koncepciója azonban megjelenik a gépi tanulási algoritmusokban a visszafelé irányuló elemzésekhez.trackirály, mélységi keresés és rekurzív metódushívások kezelése.

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