C# Stack met Push & Pop-voorbeelden

โšก Slimme samenvatting

Stack in C# is een verzameling uit de namespace System.Collections die het LIFO-principe (Last In, First Out) volgt, waarbij de Push-methode een element aan de bovenkant toevoegt en de Pop-methode het verwijdert.

  • ๐Ÿ“š LIFO-principe: Een stapel werkt net als een stapel boeken: het laatst toegevoegde element is het eerste dat verwijderd wordt.
  • โž• Duwen en knallen: De Push-methode voegt een element toe aan de bovenkant van de stapel, en de Pop-methode verwijdert dat bovenste element en retourneert het.
  • ๐Ÿ‘€ Kijk, tel, bevat: De Peek-methode leest het bovenste element zonder het te verwijderen, terwijl Count en Contains de grootte en het aantal elementen rapporteren.
  • ๐Ÿงช Uitgewerkte voorbeelden: Twee consoleprogramma's demonstreren Push met Count en Contains, en vervolgens Pop, zodat u het kunt zien. trace de LIFO-volgorde.
  • ๏ธ Algemene stapel: De stapel De klasse in System.Collections.Generic voegt typeveiligheid toe tijdens het compileren en voorkomt boxing voor nieuwe C#-code.
  • ๐Ÿค– AI-assistentie: GitHub Copilot genereert een framework voor C#-stackbewerkingen, terwijl ML.NET gegevens leest via getypte collecties in plaats van een niet-generieke stack.

C#-stapel

Wat is stapelen in C#?

De stapel is een speciale koffercollectie die een last in first out (LIFO) concept vertegenwoordigt. Laten we, om LIFO eerst te begrijpen, een voorbeeld nemen. Stel je een stapel boeken voor, waarbij elk boek op elkaar wordt gehouden.

Het concept van โ€˜last in first outโ€™ in het geval van boeken betekent dat alleen het bovenste boek van de stapel boeken kan worden verwijderd. Het is niet mogelijk om er een boek tussenuit te halen, omdat dat de stand van de stapel zou verstoren.

Vandaar in C#, de stapel werkt ook op dezelfde manier. Elementen worden toegevoegd aan de stapel, รฉรฉn boven op elkaar. Het proces van het toevoegen van een element aan de stapel wordt een push-bewerking genoemd. Om een โ€‹โ€‹element van een stapel te verwijderen, kunt u ook het bovenste element van de stapel verwijderen. Deze bewerking staat bekend als pop.

Laten we de bewerkingen die beschikbaar zijn voor de Stack-collectie eens nader bekijken.

Declaratie van de stapel

Er wordt een stapel gemaakt met behulp van het type Stack Data. Het trefwoord โ€œnieuwโ€ wordt gebruikt om een โ€‹โ€‹object van een stapel te maken. Het object wordt vervolgens toegewezen aan de variabele st.

Stack st = new Stack()

Elementen toevoegen aan de stapel

De push-methode wordt gebruikt om een โ€‹โ€‹element aan de stapel toe te voegen. De algemene syntaxis van de verklaring wordt hieronder gegeven.

Stack.push(element)

Elementen uit de stapel verwijderen

De pop-methode wordt gebruikt om een โ€‹โ€‹element van de stapel te verwijderen. De pop-bewerking retourneert het bovenste element van de stapel. De algemene syntaxis van de verklaring wordt hieronder gegeven

 Stack.pop()

Tellen

Deze eigenschap wordt gebruikt om het aantal items in de stapel te bepalen. Hieronder vindt u de algemene syntaxis van deze verklaring.

Stack.Count

Bevat

Deze methode wordt gebruikt om te zien of een element aanwezig is in de Stack. Hieronder vindt u de algemene syntaxis van deze verklaring. De instructie retourneert true als het element bestaat, anders wordt de waarde false geretourneerd.

Stack.Contains(element)

Laten we nu eens kijken hoe dit werkt op codeniveau. Alle onderstaande code wordt naar ons geschreven Console applicatie. De code wordt naar ons Program.cs-bestand geschreven.

In het onderstaande programma zullen we de code schrijven om te zien hoe we de bovengenoemde methoden kunnen gebruiken.

Voorbeeld 1: Stack.Push()-methode

In dit voorbeeld zullen we zien

  • Hoe een stapel ontstaat.
  • Hoe u de elementen van de stapel kunt weergeven en de methoden Count en Contain kunt gebruiken.

Stapel in 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 Uitleg:-

  1. De eerste stap wordt gebruikt om de stapel te declareren. Hier declareren we โ€œstโ€ als een variabele om de elementen van onze stapel vast te houden.
  2. Vervolgens voegen we 3 elementen toe aan onze stapel. Elk element wordt toegevoegd via de Push-methode.
  3. Omdat de stapelelementen nu niet toegankelijk zijn via de indexpositie zoals de array lijst, moeten we een andere aanpak gebruiken om de elementen van de stapel weer te geven. Het object (obj) is een tijdelijke variabele, die wordt gedeclareerd voor het bevatten van elk element van de stapel. Vervolgens gebruiken we de foreach-instructie om elk element van de stapel te doorlopen. Voor elk stapelelement wordt de waarde toegewezen aan de obj-variabele. Vervolgens gebruiken we de opdracht Console.Writeline om de waarde op de console weer te geven.
  4. We gebruiken de eigenschap Count (st.telling) om het aantal items in de stapel te bepalen. Deze eigenschap retourneert een nummer. Vervolgens geven we deze waarde weer aan de console.
  5. Vervolgens gebruiken we de methode Bevat om te zien of de waarde 3 aanwezig is in onze stapel. Dit retourneert een waarde waar of onwaar. Vervolgens geven we deze retourwaarde weer op de console.

Als de bovenstaande code correct is ingevoerd en het programma wordt uitgevoerd, wordt de volgende uitvoer weergegeven.

Output:

Stapel in C#

Uit de uitvoer kunnen we zien dat de elementen van de stapel worden weergegeven. Ook wordt de waarde True weergegeven om aan te geven dat de waarde 3 op de stapel is gedefinieerd.

Note: U hebt opgemerkt dat het laatste element dat op de stapel is geduwd, als eerste wordt weergegeven. Dit is het bovenste element van de stapel. Het aantal stapelelementen wordt ook weergegeven in de uitvoer.

Voorbeeld 2: Stack.Pop()-methode

Laten we nu eens kijken naar de functionaliteit "verwijderen". We zullen de code zien die nodig is om het bovenste element van de stapel te verwijderen.

Stapel in 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 Uitleg:-

  1. Hier gebruiken we alleen de pop-methode die wordt gebruikt om een โ€‹โ€‹element uit de stapel te verwijderen.

Als de bovenstaande code correct is ingevoerd en het programma wordt uitgevoerd, wordt de volgende uitvoer weergegeven.

Output:

Stapel in C#

We kunnen zien dat element 3 van de stapel is verwijderd.

C# Stack Peek() methode

De methoden `push` en `pop` werken met de bovenkant van de stack, maar soms wil je alleen het bovenste element bekijken zonder het te verwijderen. De `peek`-methode doet precies dat. Deze retourneert de bovenste waarde van de stack, terwijl de rest van de collectie ongewijzigd blijft. Dit is handig als je het volgende item wilt bekijken voordat je besluit het te verwijderen.

Stap 1) Maak een stapel en plaats er drie elementen op, zodat de waarde 3 bovenaan komt te liggen.

Stap 2) Roep de Peek-methode aan om het bovenste element te lezen en controleer vervolgens de Count-eigenschap om te bevestigen dat er niets is verwijderd.

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

  1. Er wordt een stapel met de naam st gedeclareerd, en de waarden 1, 2 en 3 worden toegevoegd met de Push-methode, waardoor 3 het bovenste element wordt.
  2. De Peek-methode retourneert het bovenste element zonder het te verwijderen, en de Count-eigenschap geeft nog steeds het totale aantal items in de stapel weer.

Wanneer het programma wordt uitgevoerd, print het de waarde. 3 vanaf Peek en vervolgens de telling 3Dit bewijst dat het element op de stapel blijft. Als de stapel leeg is, gooit Peek een Invalid-fout.OperationException, dus het is veilig om Count te controleren voordat je de functie aanroept.

Generieke stapel in C#

De bovenstaande voorbeelden gebruiken de niet-generieke Stack-klasse uit System.Collections, die elk element als een object opslaat. Moderne C#-code geeft doorgaans de voorkeur aan de generieke Stack-klasse. Deze klasse komt uit de namespace System.Collections.Generic. De stack wordt gekoppeld aan รฉรฉn enkel gedeclareerd type, waardoor de compiler elke Push- en Pop-bewerking controleert en er geen typeconversie of boxing nodig is.

De belangrijkste voordelen van de generieke Stack staan โ€‹โ€‹hieronder vermeld.

  • Type veiligheid: Het type wordt vastgelegd bij de declaratie, waardoor alleen waarden van dat type kunnen worden toegevoegd en fouten tijdens het compileren worden opgespoord.
  • Geen boksen: Waardetypen zoals int worden direct opgeslagen, waardoor de kosten van het omzetten naar een ander gegevenstype, die bij de niet-generieke Stack wel gelden, worden vermeden.
  • Schoner leest: Pop en Peek retourneren direct het gedeclareerde type, dus je hoeft het resultaat niet terug te casten van object.
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();
  }
 }
}

In dit voorbeeld wordt de stack gedeclareerd als Stack. Het accepteert dus alleen tekenreekswaarden. De Pop-methode retourneert direct een tekenreeks en print deze af. Python, de laatst toegevoegde waarde. Voor elk nieuw project is de generieke Stack is de aanbevolen keuze.

Verschil tussen Stack en Queue in C#

Een stapel en een queue Zowel stacks als queues bepalen de volgorde waarin elementen worden verwijderd, maar ze hanteren tegengestelde regels. Een stack werkt volgens het principe 'laatst erin, eerst eruit', terwijl een queue volgens het principe 'eerst erin, eerst eruit' werkt. Door de juiste te kiezen, maak je de bedoeling van je code duidelijk voor andere ontwikkelaars.

De belangrijkste verschillen staan โ€‹โ€‹hieronder vermeld:

  • Bestellen: Een stapel verwijdert eerst het meest recent toegevoegde element (LIFO), terwijl een wachtrij eerst het oudste element verwijdert (FIFO).
  • Methoden: Een stack gebruikt Push en Pop, terwijl een queue Enqueue gebruikt om elementen toe te voegen en Dequeue om elementen te verwijderen.
  • Toegang tot het bovenste element: Een stapel leest het volgende item met Peek, en een wachtrij leest het volgende item met Peek vanaf de voorkant.
  • Typische toepassingen: Stacks bieden mogelijkheden voor ongedaan maken, expressie-evaluatie en recursie. trackoning, terwijl wachtrijen geschikt zijn voor planning, buffering en breedte-eerst-traversal.

Beide typen zijn beschikbaar in een generieke vorm als Stack. en wachtrij in System.Collections.Generic, dus je profiteert van typeveiligheid met beide opties.

Veelgestelde vragen

Het aanroepen van Pop of Peek op een lege stack geeft een Invalid-fout.OperationException. Controleer eerst de eigenschap Count, of gebruik de generieke Stack-methoden TryPop en TryPeek, die false retourneren in plaats van een uitzondering te genereren wanneer de stack geen elementen bevat.

Zowel push als pop hebben een constante tijdsduur van O(1), omdat ze alleen de bovenkant van de stack aanraken. Wanneer de interne array moet groeien, wordt deze af en toe aangepast met een push, maar de gemiddelde kosten per bewerking blijven constant.

Nee. Een stack geeft alleen toegang tot de bovenste waarde via Peek en Pop, dus heeft geen indexeringsmethode zoals een lijst. Om alle waarden te lezen, moet je de stack doorlopen met een foreach-lus of kopiรซren met de ToArray-methode.

De Clear-methode verwijdert alle elementen in รฉรฉn keer van de stapel en zet Count terug op nul. Om in plaats daarvan items รฉรฉn voor รฉรฉn van bovenaf te verwijderen, roept u Pop in een lus aan totdat Count nul bereikt.

De standaard Stack-klasse is niet thread-safe voor schrijfbewerkingen wanneer meerdere threads deze tegelijkertijd wijzigen. Voor gelijktijdige toegang kunt u ConcurrentStack van System.Collections.Concurrent gebruiken, die atomaire TryPush- en TryPop-methoden biedt zonder externe vergrendelingen.

Roep de ToArray-methode aan om de inhoud van de stack naar een nieuwe array te kopiรซren, gesorteerd van boven naar beneden. Je kunt de stack ook doorgeven aan een List-constructor om een โ€‹โ€‹generieke lijst te maken.ping dezelfde volgorde.

Ja. GitHub Copilot genereert Stack-declaraties, Push- en Pop-aanroepen en foreach-lussen op basis van een korte opmerking of methodenaam. Het stelt vaak de generieke Stack-versie voor, omdat dat de aanbevolen collectie is voor nieuwe C#-code.

Stacks slaan zelden trainingsgegevens voor ML.NET op; deze stromen door getypte collecties en de IDataView-pipeline. Het LIFO-stackconcept duikt echter wel op in machine learning-algoritmen voor back-endverwerking.trackoning, dieptezoekalgoritme en het beheren van recursieve methodeaanroepen.

Vat dit bericht samen met: