Stos

Koncepcja tej struktury dynamicznej jest bardzo prosta: stos przypomina wieżę budowaną z klocków. Nowe elementy układamy na szczycie.

W przypadku stosu mamy dostęp tylko do elementu ostatnio dodanego (umieszczonego najwyżej). Nie mamy do dyspozycji mechanizmu indeksowania, który pozwala odwołać się do pozostałych elementów. Możemy jedynie sprawdzić wartość znajdującą się na samym szczycie.

Podobnie dzieje się w przypadku usuwania elementów ze stosu. Możemy zdjąć z niego tylko element znajdujący się na szczycie.

RE8CO3B57HC65
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Bardzo ważną cechą opisanej struktury jest to, że element dodany do niej jako pierwszy, zostanie usunięty jako ostatni. Stos nazywamy strukturą typu LIFO (z ang. Last In First Out, czyli „ostatni na wejściu, pierwszy na wyjściu”).

Implementacja stosu z zastosowaniem tablicy

Stos jest strukturą dynamiczną – jego rozmiar może się zmieniać w trakcie działania programu. Dla ułatwienia zrozumienia stosu zaimplementujemy go na statycznej tablicy. Musimy jedynie zastanowić się, jaki maksymalny rozmiar powinien mieć budowany stos.

Do poprawnego działania stosu potrzebujemy tylko jednej zmiennej, która będzie przechowywała indeks szczytu stosu. Przy dodawaniu nowego elementu zwiększymy wartość zmiennej o jeden, a przy usuwaniu będziemy ją zmniejszać. Pierwszym („najniższym”) elementem stosu będzie pierwszy element przechowywany w tablicy.

R2LVGQ32UFH5S
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Przeanalizujmy funkcje odpowiedzialne za dodawanie i usuwanie elementów stosu zapisane za pomocą pseudokodu. Zakładamy, że stos jest reprezentowany przez tablicę stos o rozmiarze elementów. Indeks wskazujący szczyt jest przechowywany jako zmienna indeks_szczytu. Tablicę indeksujemy od wartości .

Linia 1. funkcja dodaj podkreślnik na podkreślnik stos otwórz nawias okrągły a zamknij nawias okrągły dwukropek. Linia 2. jeżeli indeks podkreślnik szczytu zamknij nawias ostrokątny znak równości n wykonaj dwukropek. Linia 3. wypisz otwórz nawias okrągły cudzysłów Przepełnienie stosu cudzysłów zamknij nawias okrągły. Linia 4. w przeciwnym razie wykonaj dwukropek. Linia 5. stos otwórz nawias kwadratowy indeks podkreślnik szczytu zamknij nawias kwadratowy ← a. Linia 6. indeks podkreślnik szczytu ← indeks podkreślnik szczytu plus 1.
Linia 1. funkcja usun podkreślnik ze podkreślnik stosu otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 2. jeżeli indeks podkreślnik szczytu znak równości 0 wykonaj dwukropek. Linia 3. wypisz otwórz nawias okrągły cudzysłów Stos jest już pusty cudzysłów zamknij nawias okrągły. Linia 4. w przeciwnym razie wykonaj dwukropek. Linia 5. indeks podkreślnik szczytu ← indeks podkreślnik szczytu minus 1.
Linia 1. funkcja odczytaj podkreślnik ze podkreślnik stosu otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 2. zwróć stos otwórz nawias kwadratowy indeks podkreślnik szczytu minus 1 zamknij nawias kwadratowy.

W zaprezentowanym programie bardzo ważne jest, że elementy nie są faktycznie usuwane z tablicy. Wystarczy jedynie zmniejszyć indeks przechowywany w zmiennej indeks_szczytu, ponieważ przy dodawaniu następnego elementu wartość komórki zostaje nadpisana. Jest to bardzo duże ułatwienie podczas implementowania struktury.

Przykładowe zastosowania stosu

Stos jest wykorzystywany powszechnie w przypadku programów pisanych w językach wysokiego poziomu. Używa się go do przechowywania adresów pamięci i zmiennych, a także jako miejsce do zapisywania zawartości rejestrów procesora.

Słownik

rekurencja
rekurencja

technika programowania, w której funkcja wywołuje samą siebie aż do napotkania przypadku podstawowego

stos
stos

struktura danych, w której informacje są pobierane ze szczytu i na niego odkładane; struktura typu LIFO (Last In, First Out – ostatni na wejściu, pierwszy na wyjściu)

kolejka
kolejka

liniowa struktura danych, w której nowe dane dopisywane są na końcu kolejki, a z początku kolejki pobierane są dane do przetwarzania; struktura typu FIFO (First In, First Out; pierwszy na wejściu, pierwszy na wyjściu)