C# Stack med Push & Pop eksempler

⚡ Smart opsummering

Stack i C# er en samling fra System.Collections-navnerummet, der følger LIFO-princippet (sidst ind, først ud), hvor Push-metoden tilføjer et element øverst, og Pop-metoden fjerner det.

  • 📚 LIFO-konceptet: En stak fungerer som en bunke bøger, så det sidste element, der skubbes, er det første, der fjernes.
  • Tryk og pop: Push-metoden tilføjer et element til toppen af ​​stakken, og Pop-metoden fjerner og returnerer det øverste element.
  • 👀 Kig, tæl, indeholder: Peek-metoden læser det øverste element uden at fjerne det, mens Count og Contains rapporterer størrelse og medlemskab.
  • 🧪 Udarbejdede eksempler: To konsolprogrammer demonstrerer Push med Count og Contains, derefter Pop, så du kan trace LIFO-ordren.
  • 🛠️ Generisk stak: Stakken Klassen i System.Collections.Generic tilføjer typesikkerhed under kompilering og undgår indkapsling af kode i ny C#-kode.
  • 🤖 AI assistance: GitHub Copilot understøtter C# Stack-operationer, og ML.NET læser data gennem typede samlinger i stedet for en ikke-generisk stak.

C# stak

Hvad er Stack i C#?

Stakken er en specialkassesamling, som repræsenterer et sidste ind først ud (LIFO) koncept. For først at forstå LIFO, lad os tage et eksempel. Forestil dig en stak bøger med hver bog holdt oven på hinanden.

Konceptet med sidst ind først ud i tilfælde af bøger betyder, at kun den øverste bog kan fjernes fra stakken af ​​bøger. Det er ikke muligt at fjerne en bog imellem, for så ville det forstyrre stakkens indstilling.

Derfor i C#, fungerer stakken også på samme måde. Elementer føjes til stakken, et oven på hinanden. Processen med at tilføje et element til stakken kaldes en push-operation. For at fjerne et element fra en stak kan du også fjerne det øverste element af stakken. Denne operation er kendt som pop.

Lad os se mere detaljeret på de tilgængelige operationer for Stack-samlingen.

Erklæring af stakken

En stak oprettes ved hjælp af typen Stack Data. Nøgleordet "ny" bruges til at skabe et objekt af en stak. Objektet tildeles derefter variablen st.

Stack st = new Stack()

Tilføjelse af elementer til stakken

Push-metoden bruges til at tilføje et element til stakken. Udsagnets generelle syntaks er angivet nedenfor.

Stack.push(element)

Fjernelse af elementer fra stakken

Pop-metoden bruges til at fjerne et element fra stakken. Pop-operationen vil returnere det øverste element i stakken. Den generelle syntaks for sætningen er angivet nedenfor

 Stack.pop()

Tælle

Denne egenskab bruges til at få antallet af elementer i stakken. Nedenfor er den generelle syntaks for denne erklæring.

Stack.Count

Indeholder

Denne metode bruges til at se, om et element er til stede i stakken. Nedenfor er den generelle syntaks for denne erklæring. Udsagnet vil returnere sandt, hvis elementet eksisterer, ellers returnerer det værdien false.

Stack.Contains(element)

Lad os nu se, at dette fungerer på kodeniveau. Al nedenstående kode vil blive skrevet til vores Konsolapplikation. Koden vil blive skrevet til vores Program.cs fil.

I nedenstående program vil vi skrive koden for at se, hvordan vi kan bruge de ovennævnte metoder.

Eksempel 1: Stack.Push() metode

I dette eksempel vil vi se

  • Hvordan en stak bliver oprettet.
  • Sådan viser du stakkens elementer og bruger Count og Contain metoderne.

Stak i 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 Forklaring:-

  1. Det første trin bruges til at erklære stakken. Her erklærer vi "st" som en variabel til at holde elementerne i vores stak.
  2. Dernæst tilføjer vi 3 elementer til vores stak. Hvert element tilføjes via Push-metoden.
  3. Nu da stakelementerne ikke kan tilgås via indekspositionen som array liste, skal vi bruge en anden tilgang til at vise stakkens elementer. Objektet (obj) er en midlertidig variabel, som er erklæret for at holde hvert element i stakken. Vi bruger derefter foreach-sætningen til at gennemgå hvert element i stakken. For hvert stakelement tildeles værdien til obj-variablen. Vi bruger derefter kommandoen Console.Writeline til at vise værdien til konsollen.
  4. Vi bruger egenskaben Count (st.tæller) for at få antallet af elementer i stakken. Denne ejendom returnerer et nummer. Vi viser derefter denne værdi til konsollen.
  5. Vi bruger derefter Indeholder-metoden til at se, om værdien af ​​3 er til stede i vores stak. Dette vil returnere enten en sand eller falsk værdi. Vi viser derefter denne returværdi til konsollen.

Hvis ovenstående kode er indtastet korrekt, og programmet køres, vil følgende output blive vist.

Output:

Stak i C#

Fra outputtet kan vi se, at elementerne i stakken vises. Værdien af ​​True vises også for at sige, at værdien af ​​3 er defineret på stakken.

Bemærk: Du har bemærket, at det sidste element, der blev skubbet ind på stakken, vises først. Dette er det øverste element i stakken. Antallet af stakelementer vises også i outputtet.

Eksempel 2: Stack.Pop()-metoden

Lad os nu se på "fjern"-funktionen. Vi vil se den kode, der kræves for at fjerne det øverste element fra stakken.

Stak i 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 Forklaring:-

  1. Her udsteder vi bare pop-metoden, som bruges til at fjerne et element fra stakken.

Hvis ovenstående kode indtastes korrekt, og programmet køres, vil følgende output blive vist.

Output:

Stak i C#

Vi kan se, at element 3 blev fjernet fra stakken.

C# Stack Peek()-metoden

Push- og Pop-metoderne fungerer med toppen af ​​stakken, men nogle gange behøver du kun at se på det øverste element uden at fjerne det. Peek-metoden gør præcis det. Den returnerer den øverste værdi af stakken, mens samlingen forbliver uændret, hvilket er nyttigt, når du vil teste det næste element, før du beslutter dig for at pope det.

Trin 1) Opret en stak og skub tre elementer oven på den, så værdien 3 sidder øverst.

Trin 2) Kald Peek-metoden for at læse det øverste element, og tjek derefter Count-egenskaben for at bekræfte, at intet blev fjernet.

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

  1. En stak med navnet st deklareres, og værdierne 1, 2 og 3 adderes med Push-metoden, så 3 bliver det øverste element.
  2. Peek-metoden returnerer det øverste element uden at fjerne det, og Count-egenskaben rapporterer stadig det fulde antal elementer i stakken.

Når programmet kører, udskriver det værdien 3 fra Peek og derefter optællingen 3, hvilket beviser, at elementet forbliver på stakken. Hvis stakken er tom, kaster Peek en ugyldigOperationException, så det er sikkert at kontrollere Count, før det kaldes.

Generisk stak i C#

Eksemplerne ovenfor bruger den ikke-generiske Stack-klasse fra System.Collections, som gemmer hvert element som et objekt. Moderne C#-kode foretrækker normalt den generiske Stack. klasse fra navnerummet System.Collections.Generic. Den binder stakken til en enkelt deklareret type, så compileren kontrollerer alle Push og Pop, og der ikke er behov for casting eller boxing.

De vigtigste fordele ved den generiske Stack er anført nedenfor.

  • Type sikkerhed: Typen er fastsat ved deklaration, så kun værdier af den type kan pushes, og fejl fanges ved kompilering.
  • Ingen boksning: Værdityper som int gemmes direkte, hvilket undgår de "boxing costs", som den ikke-generiske stak betaler.
  • Rengøringsmiddel læser: Pop og Peek returnerer den deklarerede type direkte, så du ikke caster resultatet tilbage fra objektet.
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();
  }
 }
}

I dette eksempel erklæres stakken som Stack , så den accepterer kun strengværdier. Pop-metoden returnerer en streng direkte og udskriver Python, den sidst indtastede værdi. For ethvert nyt projekt, den generiske stak er det anbefalede valg.

Forskellen mellem stak og kø i C#

En stak og en er begge samlinger, der styrer rækkefølgen, hvori elementer fjernes, men de bruger modsatte regler. En stak er sidst ind, først ud, mens en kø er først ind, først ud. At vælge den rigtige gør intentionen med din kode tydelig for andre udviklere.

De vigtigste forskelle er anført nedenfor:

  • Order: En stak fjerner det senest tilføjede element først (LIFO), mens en kø fjerner det ældste element først (FIFO).
  • Metoder: En stak bruger Push og Pop, hvorimod en kø bruger Enqueue til at tilføje og Dequeue til at fjerne.
  • Adgang til øverste element: En stak læser sit næste element med Peek, og en kø læser sit næste element med Peek forfra.
  • Typiske anvendelser: Stakke tilpasser fortrydelsesfunktioner, udtryksevaluering og rekursion trackonge, mens køer passer til planlægning, buffering og bredde-først gennemgang.

Begge typer er tilgængelige i generisk form som Stack og kø i System.Collections.Generic, så du får typesikkerhed med begge valgmuligheder.

Ofte Stillede Spørgsmål

Kald af Pop eller Peek på en tom stak kaster en ugyldigOperationException. Tjek først egenskaben Count, eller brug de generiske Stack-metoder TryPop og TryPeek, som returnerer falsk i stedet for at udløse `false`, når stakken ikke indeholder elementer.

Både Push og Pop kører i konstant O(1) tid, fordi de kun rører toppen af ​​stakken. Når det interne array skal vokse, vil et lejlighedsvis Push ændre størrelsen på det, men den gennemsnitlige pris pr. operation forbliver konstant.

Nej. En stak eksponerer kun sin top gennem Peek og Pop, så den har ingen indekstilgang som en liste. For at læse hver værdi skal du opregne stakken med en foreach-løkke eller kopiere den ved hjælp af ToArray-metoden.

Clear-metoden fjerner alle elementer fra stakken i ét kald og nulstiller Count. For at fjerne elementer ét ad gangen fra toppen i stedet, kald Pop i en løkke, indtil Count når nul.

Standardklassen Stack er ikke trådsikker til skrivninger, når flere tråde ændrer den på én gang. For samtidig adgang skal du bruge ConcurrentStack fra System.Collections.Concurrent, som tilbyder atomare TryPush- og TryPop-metoder uden eksterne låse.

Kald ToArray-metoden for at kopiere stakken til et nyt array, sorteret fra top til bund. Du kan også sende stakken til en List-konstruktør for at opbygge en generisk liste, mens du holderping den samme rækkefølge.

Ja. GitHub Copilot skriver Stack-deklarationer, Push- og Pop-kald og foreach-løkker fra en kort kommentar eller et metodenavn. Den foreslår ofte den generiske Stack-version, da det er den anbefalede samling til ny C#-kode.

Stakke gemmer sjældent ML.NET-træningsdata, som flyder gennem typede samlinger og IDataView-pipelinen. LIFO-stakkonceptet optræder dog i maskinlæringsalgoritmer til backend-data.tracking, dybde-først søgning og håndtering af rekursive metodekald.

Opsummer dette indlæg med: