Skip to content

Instantly share code, notes, and snippets.

@pjastr
Last active December 14, 2017 16:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pjastr/63232d783793a16f07350bd101264578 to your computer and use it in GitHub Desktop.
Save pjastr/63232d783793a16f07350bd101264578 to your computer and use it in GitHub Desktop.

Stos generyczny - Stack<T>

Jak stworzyć stos generyczny dla typów prostych i referencyjnych?

Stack<int> stos = new Stack<int>();
Stack<Osoba> stos = new Stack<Osoba>();

(o ile w projekcie mamy klasę Osoba).

Jaka przestrzeń nazw (using…) jest potrzebna?

using System.Collections.Generic;

Co się dzieje, gdy dodajemy byty innego typu albo różnych typów?

Możemy dodawać typy pochodne. Jeśli nie mamy konwersji typów, zakończy się błędem kompilacji.

Jak dodaje się elementy na stos, czy trzeba po kolei, czy można dowolnie?

Do dodania czegoś na stos służy metoda Push. Elementy dodawany jest na koniec stosu. Elementy mogą się powtarzać.

Jak wypisać wszystkie elementy stosu na konsoli?

Za pomocą foreach. Kolejność zgodnie z zasadą LIFO (last-in, first-out).

Jak zwrócić ostatni i pierwszy element na stosie?

Metoda dedykowana dla stosu aby tylko zwrócić ostatni element: Peek(). Pierwszego wprost nie możemy zwrócić. Możemy użyć także metody Pop która zwraca i usuwa ostatni element ze stosu.

Jak zwrócić dowolny element z stosu, o ile to możliwe?

Możemy bezpośrednio zwrócić tylko ostatni. Zwrócenie pozostałych nie jest możliwe.

Jak posortować elementy na stosie?

Bezpośrednio nie można.

Jak sprawdzić liczbę elementów na stosie?

Poprzez pobranie właściwości: Count.

Jak sprawdzić czy stos zawiera daną wartość/referencję?

Poprzez metodę Contains.

Przykładowy kod:

            Stack<int> stos = new Stack<int>();
            stos.Push(4);
            stos.Push(66);
            stos.Push(-2);
            Console.WriteLine(stos.Contains(4)); //true
            Console.WriteLine(stos.Contains(0)); //false

Warto pamiętać, że dla typów referencyjnych sprawdzamy odwołanie. np. dla klasy Osoba:

    class Osoba
    {
        string imie;

        public Osoba(string imie)
        {
            this.imie = imie;
        }
    }

taki kod zawsze zwróci false:

            Stack<Osoba> osoby = new Stack<Osoba>();
            osoby.Push(new Osoba("Jan"));
            osoby.Push(new Osoba("Anna"));
            osoby.Push(new Osoba("Jan"));
            Console.WriteLine(osoby.Contains(new Osoba("Jan")));

Poprawnie powinniśmy zadeklarować zmienną refencyjną poza stosem:

            Osoba o1 = new Osoba("Jan");
            Osoba o2 = new Osoba("Anna");
            Stack<Osoba> osoby = new Stack<Osoba>();
            osoby.Push(o1);
            osoby.Push(o2);
            Console.WriteLine(osoby.Contains(o1));

Jak można odwrócić elementy na stosie? w tym kontekście chodzi o odwrócenie kolejności (a nie odwrotne sortowanie)

Bezpośrednio nie ma takiej możliwości. Możemy stworzyć "stos" pomocniczy, a potem zamienić odwołanie do właściwego stosu.

Jak można usuwać elementy ze stosu? czy można pierwszy, ostatni lub jakiś ze środka?

Za pomocą metody Pop która usuwa i zwraca ostatni element na stosie. Innych nie możemy bezpośrednio.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment