Skip to content

Instantly share code, notes, and snippets.

@pjastr
Last active December 17, 2017 22:06
Show Gist options
  • Save pjastr/e47bf2292462b014c4f6e0466de31d4d to your computer and use it in GitHub Desktop.
Save pjastr/e47bf2292462b014c4f6e0466de31d4d to your computer and use it in GitHub Desktop.

Kolejka niegeneryczna - Queue

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

Jak stworzyć kolejkę dla typów prostych i referencyjnych?

Queue kolejka = new Queue();

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 kolejkę, czy trzeba po kolei, czy można dowolnie? czy muszą być niepowtarzalne?

Do dodania czegoś na kolejkę służy metoda Enqueue. Elementy dodawany jest na koniec kolejki. Elementy mogą się powtarzać.

Jak wypisać wszystkie elementy kolejki na konsoli?

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

Jak zwrócić ostatni i pierwszy element w kolejce?

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

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

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

Jak posortować elementy na kolejce?

Bezpośrednio nie można.

Jak sprawdzić liczbę elementów na kolejce?

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

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

Poprzez metodę Contains.

Przykładowy kod:

            Queue kolejka2 = new Queue();
            kolejka2.Enqueue(4);
            kolejka2.Enqueue("fdg");
            kolejka2.Enqueue(-2);
            Console.WriteLine(kolejka2.Contains(4)); //true
            Console.WriteLine(kolejka2.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:

            Queue osoby = new Queue();
            osoby.Enqueue(new Osoba("Jan"));
            osoby.Enqueue(new Osoba("Anna"));
            osoby.Enqueue(new Osoba("Jan"));
            Console.WriteLine(osoby.Contains(new Osoba("Jan")));

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

            Osoba o1 = new Osoba("Jan");
            Osoba o2 = new Osoba("Anna");
            Queue osoby = new Queue();
            osoby.Enqueue(o1);
            osoby.Enqueue(o2);
            Console.WriteLine(osoby.Contains(o1));

Jak można odwrócić elementy w kolejce? 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ć "kolejkę" pomocniczą, a potem zamienić odwołanie do właściwego kolejki.

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

Za pomocą metody Dequeue która usuwa i zwraca pierwszy element w kolejce. Innych nie możemy bezpośrednio.

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