I_R_W13A_M03_JAVA Zaawansowane struktury danych
Stos, kolejka i lista w Java Collections Framework
Java Collections Framework to zestaw interfejsów oraz implementacji przeznaczonych do tworzenia omawianych wyżej struktur dynamicznych. Interfejsy w języku Java definiują abstrakcyjne metody i pola, które muszą zostać zaimplementowane w konkretnej klasie służącej do tworzenia danej kolekcji. Omawiane w materiale struktury można tworzyć za pomocą różnych interfejsów i klas.
Interfejs Deque i klasa ArrayDeque
Java Collections Framework definiuje klasę Stack będącą implementacją struktury stosu. Jednak ze względu na jej ograniczenia, m.in. dziedziczenie z niewspieranej już klasy Vector, zaleca się używanie interfejsu Deque i wybranej jego implementacji. Nazwa interfejsu Deque jest skrótem od wyrażenia double ended queue, które oznacza kolejkę dwukierunkową. Jedną z implementacji tego interfejsu jest klasa ArrayDeque, wykorzystująca dynamiczne tablice. Klasa ta implementuje m.in. następujące metody interfejsu:
push()– zadaniem metody jest umieszczenie elementu na stosie;pop()– metoda usuwa pierwszy element kolejki;getFirst()– metoda zwraca bez usuwania pierwszy element kolekcji;peek()– zadaniem metody jest pobranie wierzchołka stosu;isEmpty()– metoda sprawdza, czy stos jest pusty;size()– zadaniem metody jest zwrócenie liczby elementów na stosie.
Przykładowy program:
Na początku tworzymy obiekt stos do przechowywania wartości typu Integer (liczby całkowite). Następnie odkładamy na stosie trzy liczby za pomocą metody push, która dodaje je na początku listy. Następnie wypisujemy rozmiar (size()) i wierzchołek (getFirst()) stosu.
W kolejnych instrukcjach zdejmujemy wierzchołek ze stosu (pop()), wypisujemy rozmiar i nowy wierzchołek.
Na końcu przy użyciu pętli wykonującej się, dopóki stos nie jest pusty (isEmpty()), wypisujemy kolejny wierzchołek (peek()) i zdejmujemy go. Na końcu wypisujemy jeszcze raz aktualny rozmiar stosu.
Wynik działania programu:
Interfejs Queue i klasa LinkedList
Interfejs Queue definiuje metody dla typowych kolejek typu FIFO, kolejek priorytetowych oraz kolekcji typu LIFO (typu stos). Jedną z implementacji interfejsu dostarcza klasa LinkedList. Do dyspozycji mamy m.in. następujące metody:
add()– zadaniem metody jest dodawanie elementu na końcu listy;remove()– metoda usuwa pierwszy element listy;peek()– metoda zwraca pierwszy element listy bez usuwania go;size()– zadaniem metody jest zwrócenie liczby elementów listy.
Jeżeli do deklarowania typu struktury wykorzystujemy interfejs, ogranicza on dostępne metody, nawet jeżeli implementująca go klasa zawiera ich więcej. Na przykład klasa LinkedList definiuje ponad 30 metod do wykonywania różnych operacji na liście dwukierunkowej, ale użycie interfejsu Queue umożliwia nam wykorzystanie tylko kilku z nich przeznaczonych do obsługi kolejki.
Przykładowy program:
Na początku tworzymy obiekt kolejka, który posłuży do przechowywania wartości typu Integer (liczby całkowite). Następnie dodajemy do kolejki trzy liczby (add) po czym wypisujemy rozmiar (size()) oraz pierwszy (peek()) element.
Następnie usuwamy pierwszy element (remove()) oraz wypisujemy rozmiar oraz pierwszy element kolejki.
Na końcu przy użyciu pętli wykonującej się, dopóki kolejka nie jest pusta (size() > 0), wypisujemy kolejne pierwsze elementy i usuwamy je. Na końcu wypisujemy jeszcze raz aktualny rozmiar kolejki.
Wynik działania programu: