C# virn Push & Pop näidetega

⚡ Nutikas kokkuvõte

C# keeles on Stack System.Collections nimeruumi kogum, mis järgib LIFO (last in, first out) põhimõtet, kus Push meetod lisab elemendi algusse ja Pop meetod eemaldab selle.

  • 📚 LIFO kontseptsioon: Virn toimib nagu raamatute virn, seega viimasena lükatud element on esimene eemaldatav element.
  • Lükka ja hüppa: Push-meetod lisab elemendi pinu tippu ja Pop-meetod eemaldab ning tagastab selle kõige ülemise elemendi.
  • ???? Piilu, loe, sisaldab: Peek meetod loeb ülemist elementi seda eemaldamata, samas kui Count ja Contains annavad aru suurusest ja liikmelisusest.
  • 🧪 Toimivad näited: Kaks konsooliprogrammi demonstreerivad käsku Push koos Count ja Contains ning seejärel Pop, et saaksite tracLIFO tellimus.
  • 🛠️ Üldine virn: Stack Klass failis System.Collections.Generic lisab kompileerimisaegse tüübiturvalisuse ja väldib uue C# koodi puhul kastikujulist märkimist.
  • 🤖 AI abi: GitHub Copilot toetab C# pinu operatsioone ja ML.NET loeb andmeid tüüpitud kogumite kaudu mitte-üldkasutatava pinu asemel.

C# virn

Mis on Stack C#-s?

Virn on erijuhtude kollektsioon, mis esindab LIFO-kontseptsiooni. Et esmalt mõista LIFO-d, võtame näite. Kujutage ette virna raamatuid, kus iga raamat on üksteise peal.

Raamatute puhul tähendab "viimase esimesena väljas" kontseptsioon seda, et raamatuvirnast saab eemaldada ainult kõige kõrgema raamatu. Raamatut pole võimalik eemaldada, sest siis segaks see virna sättimist.

Seega C#, töötab ka virn samamoodi. Elemendid lisatakse virna, üks teineteise peale. Elemendi virnasse lisamise protsessi nimetatakse tõukeoperatsiooniks. Elemendi virnast eemaldamiseks saate eemaldada ka virna kõige ülemise elemendi. Seda toimingut nimetatakse popiks.

Vaatame Stacki kollektsiooni jaoks saadaolevaid toiminguid üksikasjalikumalt.

Virna deklaratsioon

Pinu luuakse tüübi Stack Data abil. Märksõna "uus" kasutatakse virna objekti loomiseks. Seejärel määratakse objekt muutujale st.

Stack st = new Stack()

Elementide lisamine virnasse

Tõukemeetodit kasutatakse elemendi lisamiseks virnale. Avalduse üldine süntaks on toodud allpool.

Stack.push(element)

Elementide eemaldamine virnast

Elemendi eemaldamiseks virnast kasutatakse pop-meetodit. Pop-operatsioon tagastab virna kõige ülemise elemendi. Avalduse üldine süntaks on toodud allpool

 Stack.pop()

Loendama

Seda atribuuti kasutatakse virnas olevate üksuste arvu hankimiseks. Allpool on selle avalduse üldine süntaks.

Stack.Count

Sisaldab

Seda meetodit kasutatakse selleks, et näha, kas virnas on elementi. Allpool on selle avalduse üldine süntaks. Avaldus tagastab tõene, kui element on olemas, vastasel juhul tagastab see väärtuse false.

Stack.Contains(element)

Nüüd vaatame, kuidas see töötab koodi tasemel. Kogu alltoodud kood kirjutatakse meile Konsooli rakendus. Kood kirjutatakse meie faili Program.cs.

Allolevas programmis kirjutame koodi, et näha, kuidas saame ülalnimetatud meetodeid kasutada.

Näide 1: Stack.Push() meetod

Selles näites näeme

  • Kuidas virn luuakse.
  • Kuidas kuvada virna elemente ning kasutada loendamis- ja sisaldamismeetodeid.

Virna 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 Selgitus:-

  1. Esimest sammu kasutatakse virna deklareerimiseks. Siin deklareerime "st" muutujana, mis hoiab meie virna elemente.
  2. Järgmisena lisame oma virnale 3 elementi. Iga element lisatakse Push-meetodi abil.
  3. Kuna virna elementidele ei pääse juurde indeksi positsiooni kaudu nagu massiivi loend, peame virna elementide kuvamiseks kasutama teistsugust lähenemist. Objekt (obj) on ajutine muutuja, mis on deklareeritud virna iga elemendi hoidmiseks. Seejärel kasutame virna iga elemendi läbimiseks foreach-lauset. Iga virnaelemendi jaoks määratakse väärtus obj muutujale. Seejärel kasutame konsooli väärtuse kuvamiseks käsku Console.Writeline.
  4. Me kasutame atribuuti Count (st.count), et saada virnas olevate üksuste arv. See vara tagastab numbri. Seejärel kuvame selle väärtuse konsoolile.
  5. Seejärel kasutame meetodit Sisaldab, et näha, kas väärtus 3 on meie virnas. See tagastab kas tõese või vale väärtuse. Seejärel kuvame selle tagastamisväärtuse konsoolile.

Kui ülaltoodud kood on õigesti sisestatud ja programm käivitatakse, kuvatakse järgmine väljund.

Väljund:

Virna C#

Väljundist näeme, et kuvatakse virna elemendid. Samuti kuvatakse True väärtus, mis ütleb, et väärtus 3 on virnas määratletud.

märkused: olete märganud, et esimesena kuvatakse viimati virna lükatud element. See on virna kõige ülemine element. Samuti kuvatakse väljundis virna elementide arv.

Näide 2: Stack.Pop() meetod

Nüüd vaatame "eemaldamise" funktsiooni. Näeme koodi, mis on vajalik virnast ülemise elemendi eemaldamiseks.

Virna 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 Selgitus:-

  1. Siin anname lihtsalt välja pop-meetodi, mida kasutatakse elemendi virnast eemaldamiseks.

Kui ülaltoodud kood on õigesti sisestatud ja programm käivitatakse, kuvatakse järgmine väljund.

Väljund:

Virna C#

Näeme, et element 3 eemaldati virnast.

C# Stack Peek() meetod

Push ja Pop meetodid töötavad pinu ülemise osaga, aga mõnikord on vaja vaadata ainult ülemist elementi ilma seda eemaldamata. Peek meetod teeb just seda. See tagastab pinu ülemise osa väärtuse, jättes kogumi muutmata, mis on kasulik, kui soovite järgmist elementi enne selle väljapanekut testida.

Step 1) Loo virn ja aseta sellele kolm elementi nii, et väärtus 3 oleks peal.

Step 2) Ülemise elemendi lugemiseks kutsuge Peek meetod ja seejärel kontrollige Count omadust, et midagi ei eemaldatud.

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

  1. Deklareeritakse pinu nimega st ning väärtused 1, 2 ja 3 liidetakse meetodi Push abil, seega saab 3-st kõige ülemine element.
  2. Peek meetod tagastab ülemise elemendi seda eemaldamata ja Count omadus kuvab endiselt pinus olevate elementide koguarvu.

Programmi käivitamisel prindib see väärtuse 3 Peekist ja seejärel krahvist 3, mis tõestab, et element jääb pinusse. Kui pinu on tühi, viskab Peek vea „Vigane“OperationException, seega on enne selle kutsumist ohutu kontrollida Count'i.

Üldine virn C#-s

Ülaltoodud näited kasutavad System.Collectionsi mitte-üldiseid Stack-klasse, mis salvestab iga elemendi objektina. Tänapäeva C# kood eelistab tavaliselt üldist Stack-klassi. Klass nimeruumist System.Collections.Generic. See seob pinu ühe deklareeritud tüübiga, seega kompilaator kontrollib iga Push'i ja Pop'i ning tüübivahetust ega poksimist pole vaja.

Üldise Stacki peamised eelised on loetletud allpool.

  • Tüübi ohutus: Tüüp fikseeritakse deklareerimisel, seega saab edastada ainult seda tüüpi väärtusi ja vead püütakse kinni kompileerimise ajal.
  • Ei mingit poksimist: Väärtusetüübid, näiteks int, salvestatakse otse, mis väldib mitte-üldkasutatava Stacki poolt makstavat poksikulu.
  • Koristaja loeb: Pop ja Peek tagastavad deklareeritud tüübi otse, seega te ei teisenda tulemust objektist tagasi.
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();
  }
 }
}

Selles näites deklareeritakse pinu kui Stack , seega aktsepteerib see ainult stringväärtusi. Pop-meetod tagastab stringi otse ja prindib Python, viimane väärtus lükati. Iga uue projekti puhul on üldine Stack on soovitatav valik.

Erinevus pinu ja järjekorra vahel C#-s

Virn ja järjekorda on mõlemad kogumid, mis kontrollivad elementide eemaldamise järjekorda, kuid kasutavad vastupidiseid reegleid. Pinu puhul on tegemist viimasena sissetuleva, esimesena väljamineva elemendiga, samas kui järjekorra puhul on esimesena sissetuleva, esimesena väljamineva elemendi valimine. Õige elemendi valimine teeb teie koodi eesmärgi teistele arendajatele selgeks.

Peamised erinevused on loetletud allpool:

  • Järjekord: Pinu puhul eemaldatakse kõigepealt viimati lisatud element (LIFO), järjekorra puhul aga kõigepealt vanim element (FIFO).
  • Meetodid: Stack kasutab Push'i ja Pop'i, samas kui järjekord kasutab lisamiseks Enqueue'i ja eemaldamiseks Dequeue'i.
  • Juurdepääs tipptasemel elementidele: Pinu loeb oma järgmist elementi Peeki abil ja järjekord loeb oma järgmist elementi Peeki abil eestpoolt.
  • Tüüpilised kasutusalad: Stacks sobivad tagasivõtmise funktsioonide, avaldiste hindamise ja rekursiooniga trackuningas, samas kui järjekorrad sobivad ajastamiseks, puhverdamiseks ja laiuspõhiseks läbimiseks.

Mõlemad tüübid on saadaval üldises vormis Stackina ja järjekord System.Collections.Generic failis, nii et tüübikindlus on tagatud mõlema valikuga.

KKK

Tühja pinu puhul Popi või Peeki kutsumine annab veateate „Vigane“.OperationException. Kontrolli esmalt omadust Count või kasuta üldisi Stack meetodeid TryPop ja TryPeek, mis tagastavad väärtuse „false” (väär), selle asemel et visata, kui pinus elemente pole.

Nii Push kui ka Pop töötavad konstantse O(1) ajaga, kuna nad puudutavad ainult pinu ülemist osa. Kui sisemine massiiv peab kasvama, muudab aeg-ajalt toimuv Push selle suurust, kuid keskmine operatsiooni maksumus jääb konstantseks.

Ei. Pinu puhul kuvatakse Peeki ja Popi kaudu ainult selle ülemine osa, seega puudub sellel indeksile ligipääsufunktsioon nagu loendil. Iga väärtuse lugemiseks nummerda pinu foreach-tsükliga või kopeeri see ToArray meetodi abil.

Meetod Clear eemaldab pinust kõik elemendid ühe väljakutsega ja lähtestab funktsiooni Count nulli. Elementide ükshaaval eemaldamiseks ülevaltpoolt kutsu meetod Pop tsüklis, kuni funktsioon Count jõuab nullini.

Standardne Stack-klass ei ole lõimekindel kirjutamiseks, kui mitu lõime seda korraga muudavad. Samaaegseks juurdepääsuks kasutage System.Collections.Concurrent'i klassi ConcurrentStack, mis pakub aatomilisi TryPush ja TryPop meetodeid ilma väliste lukkudeta.

Pinu kopeerimiseks uude massiivi, ülalt alla järjestatuna, kutsuge välja ToArray meetod. Samuti saate pinu edastada loendi konstruktorile, et luua üldine loend, samal ajal kui keeping sama järjekord.

Jah. GitHub Copilot kirjutab lühikese kommentaari või meetodi nime põhjal Stacki deklaratsioone, Push- ja Pop-kõnesid ning foreach-tsükleid. See soovitab sageli üldist Stacki versiooni, kuna see on uue C# koodi jaoks soovitatav kogum.

Pinud salvestavad harva ML.NET-i treeningandmeid, mis liiguvad läbi tüüpkogumite ja IDataView torujuhtme. LIFO pinu kontseptsioon esineb aga masinõppe algoritmides tagasiulatuvate andmete jaoks.trackuningas, sügavusotsing ja rekursiivsete meetodikõnede haldamine.

Võta see postitus kokku järgmiselt: