R1KSK8bTfIKoK
Fotografia przedstawia kartki samoprzylepne, doklejane do ściany.

I_R_W13A_M03_JAVA Zaawansowane  struktury danych

Źródło: Kelly Sikkema, domena publiczna.

Kolejka

Kolejka to liniowa struktura danych typu FIFO (ang. First‑In, First‑Out – pierwszy na wejściu, pierwszy na wyjściu), co oznacza, że jej elementy odczytywane są zgodnie z kolejnością dodawania, a zatem odwrotnie niż w przypadku stosu.

W implementacji kolejki również użyjemy listy jednokierunkowej oraz takiej samej jak w przypadku stosu definicji klasy Wezel. Natomiast klasa Kolejka będzie zawierała dwa pola:

  • glowa – referencję na pierwszy element kolejki;

  • ogon – referencję na ostatni element kolejki, który ułatwi dodawanie elementów na końcu listy.

Nazwy pozostałych metod dostosujemy do omawianej struktury.

Linia 1. class Wezel otwórz nawias klamrowy. Linia 2. int liczba średnik. Linia 3. Wezel nastepny średnik. Linia 4. Wezel otwórz nawias okrągły int liczba zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. this kropka liczba znak równości liczba średnik. Linia 6. this kropka nastepny znak równości null średnik. Linia 7. zamknij nawias klamrowy. Linia 8. zamknij nawias klamrowy. Linia 10. class Kolejka otwórz nawias klamrowy. Linia 11. Wezel glowa średnik. Linia 12. Wezel ogon średnik. Linia 13. otwórz nawias ostrokątny code style znak równości cudzysłów white minus space dwukropek pre średnik cudzysłów data minus inline zamknij nawias ostrokątny public Kolejka otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 14. glowa znak równości ogon znak równości null średnik. Linia 15. zamknij nawias klamrowy. Linia 17. prawy ukośnik prawy ukośnik Miejsce na metody otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny. Linia 19. zamknij nawias klamrowy.

Metoda czyPusta() działa tak samo, jak w przypadku stosu i każdej listy, tzn. jeżeli referencja na pierwszy element jest pusta, lista jest pusta.

Linia 1. public boolean czyPusta otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. return otwórz nawias okrągły glowa znak równości znak równości null zamknij nawias okrągły średnik. Linia 3. zamknij nawias klamrowy.

Metoda dodaj() będzie dodawała nowe elementy na końcu listy przy użyciu pola ogon.

Linia 1. public void dodaj otwórz nawias okrągły int liczba zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. Wezel nowy znak równości new Wezel otwórz nawias okrągły liczba zamknij nawias okrągły średnik. Linia 3. nowy kropka nastepny znak równości null średnik. Linia 4. otwórz nawias ostrokątny code style znak równości cudzysłów white minus space dwukropek pre średnik cudzysłów data minus inline zamknij nawias ostrokątny if otwórz nawias okrągły czyPusta otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. glowa znak równości ogon znak równości nowy średnik. Linia 6. return średnik. Linia 7. zamknij nawias klamrowy. Linia 9. ogon kropka nastepny znak równości nowy średnik. Linia 10. ogon znak równości nowy średnik otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny. Linia 12. zamknij nawias klamrowy.

Na początku metody tworzymy nowy węzeł, przypisujemy otrzymaną liczbę do jego pola liczba, a referencję nastepny ustawiamy na wartość pustą. Następnie, jeżeli lista jest pusta, referencje na pierwszy (glowa) i ostatni (ogon) element listy ustawiamy na nowy węzeł.

W przeciwnym razie referencję nastepny dotychczasowego ostatniego elementu ustawiamy na nowy węzeł i aktualizujemy referencję ogon, aby wskazywał nowo dodany element.

Metoda usun() będzie zwracała kolejne elementy z początku listy, czyli działać będzie tak samo, jak metoda zdejmij() w przypadku stosu. Ponieważ jednak elementy będą dodawane na końcu listy, zasada działania kolejki FIFO zostanie zachowana.

Linia 1. public int usun otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. if otwórz nawias okrągły czyPusta otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły return Integer kropka MIN podkreślnik VALUE średnik. Linia 3. Wezel pomocniczy znak równości glowa średnik. Linia 4. int liczba znak równości pomocniczy kropka liczba średnik. Linia 5. glowa znak równości glowa kropka nastepny średnik. Linia 6. otwórz nawias ostrokątny code style znak równości cudzysłów white minus space dwukropek pre średnik cudzysłów data minus inline zamknij nawias ostrokątny System kropka out kropka println otwórz nawias okrągły cudzysłów Usuwam dwukropek cudzysłów plus Integer kropka toString otwórz nawias okrągły liczba zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 8. return liczba średnik otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny. Linia 10. zamknij nawias klamrowy.
Ćwiczenie 1

Wykorzystaj omówiony kod i przygotuj program pozwalający sprawdzić działanie kolejki. Dodaj do kolejki trzy liczby, wypisz kolejkę, a następnie cztery raz wywołaj metodę usuwającą.

RJl1aILncO7Yk
sss