Skip to content

Instantly share code, notes, and snippets.

@pjastr
Last active December 17, 2017 22:03
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/455940042a291a25ac3a9b34b46cf7b6 to your computer and use it in GitHub Desktop.
Save pjastr/455940042a291a25ac3a9b34b46cf7b6 to your computer and use it in GitHub Desktop.

Stos niegeneryczny - Stack

Uwaga: nie mylić z generyczną wersją Stack<T>.

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

Stack stos = new Stack();

Jaka przestrzeń nazw (using…) jest potrzebna?

using System.Collections;

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

Możemy bez problemu dodawać byty różnych typów.

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 stos = new Stack();
            stos.Push(4);
            stos.Push("fdg");
            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 osoby = new Stack();
            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 osoby = new Stack();
            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