Stosy i kolejki jako elementarne struktury danych
Kolejka, czyli struktura FIFO
Najważniejsze właściwości kolejki, która jest często określana mianem FIFO (First In – First Out), co wolnym tłumaczeniu znaczy “pierwszy wchodzi – pierwszy wychodzi”.
Otóż kolejka jest rodzajem struktury przechowującej zbiór danych. Do tego zbioru mogą być dodawane nowe elementy, jak również “wyjmowane” z niego. W przypadku składowania danych w strukturze FIFO, nowy element jest wstawiany na koniec kolejki, natomiast pobieranie danych (wyjmowanie) z kolejki jest możliwe jedynie poprzez wyciągnięcie elementu znajdującego się na jej początku
Tak więc jedyne możliwe operacje do wykonania na kolejce to:
- dodanie elementu na koniec kolejki
- usunięcie (pobranie) pierwszego elementu z kolejki
Stos, czyli struktura LIFO
Stos (ang. stack) jest jedną z najważniejszych struktur danych używanych w algorytmach komputerowych. Podstawowe cechy można zawrzeć w stwierdzeniu “ostatni wchodzi – pierwszy wychodzi”, czyli w skrócie LIFO (Last In – First Out).
Obsługa stosu wygląda następująco: dostęp do danych ułożonych na stosie mamy umożliwiony tylko od góry – możemy sobie wyobrazić, że mamy przykładowo stos kart do gry. Kładziemy karty jedna na drugiej, potem kolejną, i jeszcze następną. Gdy przyjdzie nam ochota zobaczyć pierwszą z położonych kart, musimy najpierw zdjąć jedną kartę położoną jako ostatnia, potem jeszcze kilka kolejnych aż w końcu „dobrniemy” do interesującej nas karty. Musieliśmy się dostać aż na sam spód tego stosu.
Zazwyczaj przy implementacji stosu definiuje się dwie funkcje operujące na nim – najczęściej są nazywane w ten sposób:
- push(x) – czyli odłożenie obiektu na stos;
- pop() – ściągnięcie obiektu ze stosu i zwrócenie jego wartości;
Pierwsza z nich ma za zadanie odłożenie wartości zmiennej x na stos, natomiast funkcja pop pobiera argument leżący na wierzchu stosu i zwraca jego wartość. Podczas implementacji obu tych funkcji należy pamiętać o właściwej obsłudze błędów. Przed położeniem elementu na stosie należy sprawdzić, czy nie jest on pełny – jeśli tak, to program powinien sygnalizować błąd przepełnienia stosu. Podobnie jest w przypadku wywołania funkcji pop – na samym początku ciała funkcji powinno się stwierdzić, czy dany stos jest pusty – w razie odpowiedzi twierdzącej wypadałoby poinformować o błędzie niedomiaru.