II. Klasy i pakiety Uwaga. Poniższe zadania wykonaj poza środowiskiem programistycznym, korzystając z narzędzi konsolowych. Zadanie 1. Zapoznaj się z zawartością pliku StackExample.java. Zaimplementuj klasę Stack, oferującą funkcjonalność stosu. Klasa ta powinna zawierać następujące atrybuty: — maxSize typu int, zawierający maksymalny możliwy rozmiar stosu; wartość tego atrybutu powinna być definiowana przez parametr konstruktora (wykorzystaj słowo kluczowe this), — tablicę elementów typu long o nazwie stackArray, przechowującą elementy stosu, — top typu int, przechowujący indeks ostatniego elementu na stosie; jeśli stos jest pusty, atrybut top powinien przechowywać wartość -1, oraz następujące metody: — konstruktor wykonujący wszystkie niezbędne operacje inicjujące w oparciu o jedyny argument będący maksymalną wielkością stosu, — push zwracającą wartość typu boolean, przyjmującą argument typu long i umieszczającą go na stosie oraz zwracającą true, jeśli na stosie jest jeszcze miejsce i umieszczono tam element oraz false, jeśli stos jest już pełny, — pop zwracającą wartość typu long, zdejmującą ostatni element ze stosu, — peek zwracającą wartość typu long — wartość ostatniego elementu na stosie bez zdejmowania go ze stosu, — isEmpty zwracającą wartość typu boolean — true, jeśli stos jest pusty i false w przeciwnym przypadku, — isFull zwracającą wartość typu boolean — true, jeśli stos jest pełny i false w przeciwnym przypadku, Skompiluj plik i sprawdź działanie otrzymanego programu. Które elementy składowe powinny być prywatne, a które publiczne? Co by się stało, gdyby klasa Stack była prywatna? Zadanie 2. Przeciąż konstruktor klasy Stack tak, aby można go było wykonać z dwoma argumentami – pierwszym określającym maksymalny rozmiar stosu i drugim, będącym tablicą wartości typu long, które mają być umieszczone na stosie zaraz po jego utworzeniu. Wewnątrz nowego konstruktora odwołaj się do starego konstruktora przez wywołanie this(maxSize), a następnie umieść elementy na stosie, korzystając z metody push. 1 Zadanie 3. Zapoznaj się z zawartością katalogu stack. Uzupełnij zawartość pliku Stack.java klasą, którą skonstruowałeś w poprzednim zadaniu. Aby skompilować pakiet (zbiór plików źródłowych), wykonaj następujące polecenia: $ cd stack # przejdź do katalogu stack $ javac StackExample.java Stack.java Sprawdź, czy możesz skompilować pliki źródłowe osobno. Spróbuj uruchomić program odowłując się do głównej klasy $ java StackExample Czy udało się? Spróbuj zrobić to samo, wykonując polecenia $ cd .. # przejdź do katalogu nadrzędnego względem stack $ java stack.StackExample Co oznacza ostatnie polecenie? Dlaczego argument programu java ma taką postać? Czy cała procedura zadziała, jeśli z któregokolwiek z plików źródłowych usuniemy deklarację pakietu? Zadanie 4. Zapoznaj się z plikiem StackPackage.java. Odwołuje się on (za pośrednictwem instrukcji import) do klasy Stack z pakietu utworzonego w poprzednim zadaniu. Sprawdź, czy uda się skompilować ten plik i uruchomić program. Co należy zrobić, aby było to możliwe? Czy po wprowadzeniu zmiany w pliku Stack.java trzeba go kompilować osobno, czy też dzieje się to automatycznie przy próbie kompilacji pliku StackPackage.java, który się do niego odwołuje? Czy kompilacja pliku Stack.java dokonywana jest za każdym razem, czy tylko w przypadku, gdy jego zawartość się zmieniła? Uwaga. W kolejnych zadaniach operuj na klasie Stack w pakiecie stack oraz na klasie StackPackage. Zadanie 5. Do klasy Stack dodaj statyczny i prywatny atrybut noOfElements, zawierający liczbę elementów przechowywanych we wszystkich utworzonych stosach. Aby ustalić początkową wartość tego atrybutu, skorzystaj z możliwości bloku static. Zaimplementuj też statyczną metodę count zwracającą bieżącą wartość tego atrybutu. Utwórz kilka stosów i umieść na nich różne liczby elementów. Sprawdź, jakie wartości zwraca metoda count. Zadanie 6. Sprawdź, co się stanie, jeśli spróbujesz wypisać na ekranie zmienną typu Stack, korzystając z metody toString. Dlaczego możesz skorzystać z tej metody, chociaż nie została zaimplementowana? Co się dzieje, jeśli pominiesz wywołanie metody toString? Zadanie 7. Zaimplementuj w klasie Stack metody toString i equals, które, odpowiednio, zwracają zawartość stosu w postaci ciągu znaków i weryfikują równość dwóch obiektów typu Stack. Przyjmujemy, że dwa obiekty typu Stack są równe, jeśli ciągi znaków je reprezentujące są identyczny. Porównaj efekt z tym z poprzedniego zadania. 2