Stos C# z przykładami Push & Pop

⚡ Inteligentne podsumowanie

Stos w języku C# to kolekcja z przestrzeni nazw System.Collections, która stosuje zasadę „ostatni wszedł, pierwszy wyszedł” (LIFO), w której metoda Push dodaje element na górze, a metoda Pop go usuwa.

  • 📚 Koncepcja LIFO: Stos działa jak stos książek, więc ostatni włożony element jest pierwszym usuniętym.
  • Pchnij i wyskocz: Metoda Push dodaje element na szczyt stosu, a metoda Pop usuwa i zwraca element znajdujący się najwyżej.
  • ???? Podgląd, Policzenie, Zawiera: Metoda Peek odczytuje górny element bez usuwania go, natomiast Count i Contains raportują rozmiar i przynależność.
  • 🧪 Przykładowe rozwiązania: Dwa programy konsolowe demonstrują polecenie Push z funkcją Count i Contains, a następnie Pop, dzięki czemu możesz trace zlecenie LIFO.
  • 🛠️. Stos ogólny: Stos Klasa w System.Collections.Generic dodaje bezpieczeństwo typu w czasie kompilacji i unika pakowania nowego kodu C#.
  • 🤖 Pomoc AI: GitHub Copilot obsługuje operacje stosu C#, a ML.NET odczytuje dane za pomocą kolekcji typów zamiast stosu niestandardowego.

Stos C#

Co to jest stos w języku C#?

Stos to specjalna kolekcja przypadków, która reprezentuje koncepcję „ostatnie weszło, pierwsze wyszło” (LIFO). Aby najpierw zrozumieć LIFO, weźmy przykład. Wyobraź sobie stos książek, z których każda jest ułożona jedna na drugiej.

Koncepcja „ostatni weszło, pierwsze wyszło” w przypadku książek oznacza, że ​​ze stosu książek można usunąć tylko książkę znajdującą się najwyżej. Nie ma możliwości usunięcia książki pomiędzy nimi, gdyż zaburzyłoby to ustawienie stosu.

Stąd w C#, stos działa w ten sam sposób. Elementy są dodawane do stosu, jeden na drugim. Proces dodawania elementu do stosu nazywa się operacją push. Aby usunąć element ze stosu, możesz również usunąć najwyższy element stosu. Operacja ta jest znana jako pop.

Przyjrzyjmy się bliżej operacjom dostępnym dla kolekcji Stack.

Deklaracja stosu

Stos tworzony jest za pomocą typu Stack Data. Słowo kluczowe „nowy” służy do tworzenia obiektu stosu. Obiekt zostaje następnie przypisany do zmiennej st.

Stack st = new Stack()

Dodawanie elementów do stosu

Metoda push służy do dodawania elementu na stos. Ogólna składnia instrukcji jest podana poniżej.

Stack.push(element)

Usuwanie elementów ze stosu

Metoda pop jest używana do usuwania elementu ze stosu. Operacja pop zwróci najwyższy element stosu. Ogólna składnia polecenia jest podana poniżej

 Stack.pop()

Liczyć

Ta właściwość służy do pobierania liczby elementów na stosie. Poniżej znajduje się ogólna składnia tego stwierdzenia.

Stack.Count

zawiera

Ta metoda służy do sprawdzania, czy element znajduje się na stosie. Poniżej znajduje się ogólna składnia tego stwierdzenia. Instrukcja zwróci wartość true, jeśli element istnieje, w przeciwnym razie zwróci wartość false.

Stack.Contains(element)

Zobaczmy teraz, jak to działa na poziomie kodu. Cały poniższy kod zostanie zapisany w pliku nasz Aplikacja konsoli. Kod zostanie zapisany w naszym pliku Program.cs.

W poniższym programie napiszemy kod, aby zobaczyć, jak możemy wykorzystać powyższe metody.

Przykład 1: Metoda Stack.Push().

W tym przykładzie zobaczymy

  • Jak powstaje stos.
  • Jak wyświetlić elementy stosu i użyć metod Count i Contain.

Stos w 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 Wyjaśnienie:-

  1. Pierwszy krok służy do zadeklarowania stosu. Tutaj deklarujemy „st” jako zmienną przechowującą elementy naszego stosu.
  2. Następnie dodajemy 3 elementy do naszego stosu. Każdy element dodawany jest metodą Push.
  3. Teraz, ponieważ nie można uzyskać dostępu do elementów stosu poprzez pozycję indeksu, np lista tablic, musimy zastosować inne podejście do wyświetlania elementów stosu. Obiekt (obj) jest zmienną tymczasową, która jest zadeklarowana do przechowywania każdego elementu stosu. Następnie używamy instrukcji foreach, aby przejść przez każdy element stosu. Dla każdego elementu stosu wartość jest przypisana do zmiennej obj. Następnie używamy polecenia Console.Writeline, aby wyświetlić wartość na konsoli.
  4. Używamy właściwości Count (liczba st), aby uzyskać liczbę elementów na stosie. Ta właściwość zwróci liczbę. Następnie wyświetlamy tę wartość na konsoli.
  5. Następnie używamy metody Zawiera, aby sprawdzić, czy na naszym stosie znajduje się wartość 3. To zwróci wartość true lub false. Następnie wyświetlamy tę zwracaną wartość na konsoli.

Jeżeli powyższy kod zostanie wpisany poprawnie i program zostanie uruchomiony, wyświetlony zostanie następujący wynik.

Wyjście:

Stos w C#

Z wyjścia możemy zobaczyć, że elementy stosu są wyświetlane. Ponadto wyświetlana jest wartość True, aby powiedzieć, że wartość 3 jest zdefiniowana na stosie.

Note: Zauważyłeś, że ostatni element włożony na stos jest wyświetlany jako pierwszy. Jest to najwyższy element stosu. Liczba elementów stosu jest również wyświetlana w wyjściu.

Przykład 2: Metoda Stack.Pop().

Przyjrzyjmy się teraz funkcji „usuń”. Zobaczymy kod wymagany do usunięcia najwyższego elementu ze stosu.

Stos w 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 Wyjaśnienie:-

  1. Tutaj po prostu wydajemy metodę pop, która służy do usuwania elementu ze stosu.

Jeżeli powyższy kod zostanie wpisany poprawnie i program zostanie uruchomiony, wyświetlony zostanie następujący wynik.

Wyjście:

Stos w C#

Widzimy, że element 3 został usunięty ze stosu.

Metoda C# Stack Peek()

Metody Push i Pop działają na szczycie stosu, ale czasami wystarczy spojrzeć na element na szczycie bez jego usuwania. Metoda Peek robi dokładnie to samo. Zwraca najwyższą wartość stosu, pozostawiając kolekcję bez zmian, co jest przydatne, gdy chcesz przetestować kolejny element przed podjęciem decyzji o jego usunięciu.

Krok 1) Utwórz stos i umieść na nim trzy elementy tak, aby wartość 3 znalazła się na górze.

Krok 2) Wywołaj metodę Peek, aby odczytać górny element, a następnie sprawdź właściwość Count, aby upewnić się, że nic nie zostało usunięte.

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 Wyjaśnienie:-

  1. Deklarowany jest stos o nazwie st, a wartości 1, 2 i 3 są dodawane za pomocą metody Push, więc 3 staje się elementem znajdującym się na szczycie stosu.
  2. Metoda Peek zwraca najwyższy element bez usuwania go, a właściwość Count nadal raportuje pełną liczbę elementów w stosie.

Po uruchomieniu programu drukowana jest wartość 3 z Peek i następnie liczenie 3, co dowodzi, że element pozostaje na stosie. Jeśli stos jest pusty, Peek zgłasza błąd InvalidOperationException, więc przed jego wywołaniem można bezpiecznie sprawdzić wartość Count.

Stos ogólny w C#

Powyższe przykłady wykorzystują niegeneryczną klasę Stack z System.Collections, która przechowuje każdy element jako obiekt. Współczesny kod C# zazwyczaj preferuje generyczną klasę Stack. Klasa z przestrzeni nazw System.Collections.Generic. Wiąże stos z jednym zadeklarowanym typem, dzięki czemu kompilator sprawdza każde polecenie Push i Pop, bez potrzeby rzutowania ani pakowania.

Główne korzyści wynikające z ogólnego stosu są wymienione poniżej.

  • Bezpieczeństwo typu: Typ jest ustalany podczas deklaracji, więc można przesyłać tylko wartości tego typu, a błędy są wychwytywane w momencie kompilacji.
  • Bez boksu: Typy wartości, takie jak int, są przechowywane bezpośrednio, co pozwala uniknąć kosztów pakowania, które ponosi stos niegeneryczny.
  • Czyściciel czyta: Pop i Peek zwracają zadeklarowany typ bezpośrednio, więc nie trzeba rzutować wyniku z obiektu.
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();
  }
 }
}

W tym przykładzie stos jest zadeklarowany jako Stack , więc akceptuje tylko wartości typu string. Metoda Pop zwraca bezpośrednio ciąg znaków i drukuje Python, ostatnia wprowadzona wartość. W przypadku każdego nowego projektu, ogólny stos jest zalecanym wyborem.

Różnica między stosem a kolejką w języku C#

Stos i kolejka Obie kolekcje kontrolują kolejność usuwania elementów, ale stosują odwrotne reguły. Stos działa na zasadzie „ostatni wszedł, pierwszy wyszedł”, a kolejka na zasadzie „pierwszy wszedł, pierwszy wyszedł”. Wybór odpowiedniej reguły sprawia, że ​​intencja Twojego kodu staje się jasna dla innych programistów.

Poniżej wymieniono najważniejsze różnice:

  • Zamówienie: Stos usuwa najpierw ostatnio dodany element (LIFO), natomiast kolejka usuwa najpierw najstarszy element (FIFO).
  • metody: Stos używa operacji Push i Pop, natomiast kolejka używa operacji Enqueue do dodawania i Dequeue do usuwania.
  • Dostęp do najwyższego elementu: Stos odczytuje swój następny element za pomocą Peek, a kolejka odczytuje swój następny element za pomocą Peek od przodu.
  • Typowe zastosowania: Stosy obejmują funkcje cofania, ocenę wyrażeń i rekurencję trackról, podczas gdy kolejki dopasowują się do harmonogramu, buforowania i przeglądania wszerz.

Oba typy są dostępne w formie generycznej jako Stack i kolejka w System.Collections.Generic, dzięki czemu przy każdym wyborze zyskujesz bezpieczeństwo typu.

FAQ

Wywołanie Pop lub Peek na pustym stosie powoduje wyrzucenie błędu InvalidOperationException. Najpierw sprawdź właściwość Count lub użyj ogólnych metod stosu TryPop i TryPeek, które zwracają false zamiast wyrzucać wyjątek, gdy stos nie zawiera żadnych elementów.

Operacje Push i Pop działają w stałym czasie O(1), ponieważ dotykają tylko wierzchołka stosu. Gdy wewnętrzna tablica musi się powiększyć, sporadyczne operacje Push zmieniają jej rozmiar, ale średni koszt operacji pozostaje stały.

Nie. Stos udostępnia tylko swój wierzchołek poprzez Peek i Pop, więc nie ma dostępu do indeksu, takiego jak lista. Aby odczytać każdą wartość, należy wyliczyć stos za pomocą pętli foreach lub skopiować go za pomocą metody ToArray.

Metoda Clear usuwa wszystkie elementy ze stosu za jednym wywołaniem i resetuje Count do zera. Aby usuwać elementy pojedynczo, od góry, należy wywołać metodę Pop w pętli, aż Count osiągnie zero.

Standardowa klasa Stack nie jest bezpieczna wątkowo w przypadku operacji zapisu, gdy kilka wątków zmienia ją jednocześnie. Aby uzyskać dostęp współbieżny, należy użyć klasy ConcurrentStack z System.Collections.Concurrent, która oferuje atomowe metody TryPush i TryPop bez blokad zewnętrznych.

Wywołaj metodę ToArray, aby skopiować stos do nowej tablicy, uporządkowanej od góry do dołu. Możesz również przekazać stos do konstruktora List, aby zbudować listę generyczną, podczas gdy…ping to samo zamówienie.

Tak. GitHub Copilot zapisuje deklaracje Stack, wywołania Push i Pop oraz pętle foreach na podstawie krótkiego komentarza lub nazwy metody. Często sugeruje ogólną wersję Stack, ponieważ jest to zalecana kolekcja dla nowego kodu C#.

Stosy rzadko przechowują dane treningowe ML.NET, które przepływają przez kolekcje typizowane i potok IDataView. Jednak koncepcja stosu LIFO pojawia się w algorytmach uczenia maszynowego dla…trackról, przeszukiwanie w głąb i zarządzanie rekurencyjnymi wywołaniami metod.

Podsumuj ten post następująco: