Napisz program, który pozwoli odczytać w dowolnym momencie maksymalną wartość ze stosu. Zakładamy, że maksimum jest sprawdzane po każdym położeniu / zdjęciu elementu ze stos, a więc operacja musi być optymalnie zaimplementowana.
Oto przykładowe operacje na stosie:
Stos | Maksimum |
---|---|
{0} | 0 |
{0, 3} | 3 |
{0, 3, 1} | 3 |
{0, 3, 1, 4} | 4 |
Najprotszy sposób, który pozwoli na uzyskanie maksimum stosu polega na napisaniu funkcji, która przejrzy wszystkie jego elementy, a następnie zwróci wynik. Jednak taka metoda nie jest optymalna, ponieważ wymaga bardzo dużej ilości operacji przenoszenia elementów oraz porównywania. Optymalny sposób polega na utworzeniu bufora do którego będzie zapisywane aktualne maksimum, którego zostanie wybrane jako większa wartość z wierzchu bufora oraz wstawianej wartości. Podczas zdejmowania elementu należy zdjąć wartość z stosu głównego oraz maksimum.
Tego typu metoda pozwala na odczytanie maksimum stosu w stałym czasie O(1), ale wymaga drugie tyle pamięci (dla każdego wstawianej wartości musimy zapamiętać jeszcze jedną wartość tj. maksimum).
Implementacja polega na naapisaniu klasy MaxStos, która pozwoli na dozwolone operacje stosu. Poniższy kod nie uwzględnia obsługi wszystkich błędów jakie mogą wystąpić.
Użytkownik korzystając z klasy MaxStos nie powinien mieć dostepu, ani do stosu głównego, ani bufora maksimum, ponieważ niesynchronizowana operacja pomiędzy stosami doprowadzi do niepoprawnego działania klasy.
W celu zachowania synchronizacja pomiędzy stosami należy zdefiniować własne metody do sprawdzania wierzchu stosu Podejrzyj(), dodawania elementu Dodaj(), zdejmowania elementu ze stosu Zdejmij oraz Maksimum(), aby sprawdzić aktualnie największą wartość położoną na stosie.
W celu przetestowania kodu można skorzystać z poniższego fragmentu programu, który dodaje na stos n elementów, ale dwa ostatnie ustawia na 0 i 1, a następnie zdejmuje wszystkie elementy.