Kolejka

Każdy z nas miał do czynienia z kolejkąkolejkakolejką w sklepie. Zasada jej działania jest dosyć prosta: osoba, która znajduje się przed nami, pojawiła się wcześniej, a więc zostanie wcześniej obsłużona. Tak samo działa struktura danych zwana kolejką.

Kolejka jest przeciwieństwem stosu, jeśli chodzi o sposób dodawania i usuwania elementów. Nazywamy ją strukturą typu FIFO (z ang. First In First Out, czyli „pierwszy na wejściu, pierwszy na wyjściu”). Nowy element jest dodawany na końcu kolejki. Natomiast jako pierwszy usuwany jest element z początku kolejki.

Kolejka może być wykorzystana np. w teorii grafów w algorytmie przeszukiwania grafu wszerz. 

R1MFOU9MQ1DDA
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Tak jak w przypadku stosu, nie możemy użyć indeksowania, aby odwołać się do dowolnych elementów składających się na kolejkę. Jesteśmy w stanie tylko odczytać wartości znajdujące się na jej początku.

Implementacja kolejki z zastosowaniem tablicy

Kolejka także jest strukturą dynamiczną, lecz możemy ją zaimplementować, używając statycznej tablicy. Jedynym ograniczeniem jest maksymalna liczba przechowywanych w kolejce elementów.

Aby kolejka działała poprawnie, konieczne jest użycie dwóch zmiennych. Jedna z nich będzie wskazywała początek kolejki, natomiast druga jej koniec.

RN65A16RLB8FU
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Poniżej znajdują się zapisane za pomocą pseudokodu funkcje wykorzystywane podczas dodawania i usuwania elementów kolejki. Zakładamy, że kolejka jest reprezentowana przez tablicę kolejka o rozmiarze elementów. Indeksy początku oraz końca kolejki są przechowywane w postaci zmiennych indeks_poczatek oraz indeks_koniec. Początkowa wartość indeks_poczatek wynosi . Zmienną indeks_koniec inicjalizujemy z kolei wartością o jeden mniejszą, czyli . Tablicę indeksujemy od wartości .

Linia 1. Funkcja dodaj podkreślnik do podkreślnik kolejki otwórz nawias okrągły a zamknij nawias okrągły dwukropek. Linia 2. jeżeli indeks podkreślnik koniec znak równości indeks podkreślnik poczatek wykonaj dwukropek. Linia 3. wypisz otwórz nawias okrągły cudzysłów Kolejka jest pełna cudzysłów zamknij nawias okrągły. Linia 4. w przeciwnym razie wykonaj dwukropek. Linia 5. kolejka otwórz nawias kwadratowy indeks podkreślnik koniec zamknij nawias kwadratowy ← a. Linia 6. indeks podkreślnik koniec ← indeks podkreślnik koniec minus 1. Linia 8. jeżeli indeks podkreślnik koniec otwórz nawias ostrokątny 0 dwukropek. Linia 9. indeks podkreślnik koniec ← n minus 1.
Linia 1. Funkcja usun podkreślnik z podkreślnik kolejki otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 2. jeżeli indeks podkreślnik koniec znak równości otwórz nawias okrągły indeks podkreślnik poczatek minus 1 zamknij nawias okrągły. Linia 3. LUB indeks podkreślnik poczatek znak równości 0 ORAZ indeks podkreślnik koniec znak równości n minus 1 dwukropek. Linia 4. wypisz otwórz nawias okrągły cudzysłów Kolejka jest pusta cudzysłów zamknij nawias okrągły. Linia 5. w przeciwnym razie dwukropek. Linia 6. indeks podkreślnik poczatek ← indeks podkreślnik poczatek minus 1. Linia 8. jeżeli indeks podkreślnik poczatek otwórz nawias ostrokątny 0 dwukropek. Linia 9. indeks podkreślnik poczatek ← n minus 1.

Przedstawiony za pomocą pseudokodu program może wydawać się skomplikowany, ponieważ zawiera dużo instrukcji warunkowych. Odpowiadają one za przesuwanie indeksów wskazujących krańce kolejki z początku na koniec tablicy. Dzięki temu nigdy nie wychodzimy poza zakres tablicy w wyniku modyfikacji indeksów.

Dodatkowo indeks_poczatek zawsze wskazuje indeks komórki tablicy za pierwszym elementem. Jest to pewne ułatwienie, które pomaga stwierdzić, kiedy kolejka jest pełna, a kiedy pusta. Jego wadą jest to, że kolejka może przechowywać nie , lecz elementów. Aby dokładniej zrozumieć, dlaczego tak się dzieje, pomocne mogą okazać się aplety dostępne w sekcji „Aplet”, których zadaniem jest wizualizowanie działania kolejki.

Dla zainteresowanych

Istnieje również wariant kolejki nazywany kolejką priorytetową. Charakteryzuje się ona tym, że elementy znajdujące się w kolejce są zawsze posortowane. W rezultacie na początku kolejki zawsze znajduje się najmniejszy bądź największy element.

kolejka
kolejka

liniowa struktura danych, w której nowe dane dopisywane są na końcu kolejki, a z początku kolejki pobierane są dane do przetwarzania; struktura typu FIFO (First In, First Out; pierwszy na wejściu, pierwszy na wyjściu)