Co to jest struktura danych Stos
Przede wszystkim rzućmy okiem jak wygląda struktura danych stos. Jest to liniowa struktura danych działająca według zasady ostatnie weszło-pierwsze wyszło (Last-in-First-Out, LIFO). Jest to jakby przeciwieństwo kolejki. Wyobraź sobie talię kart lub stos książek w pudełku. Książka, którą położysz na stosie jako pierwszą, jest na dole, a pierwszą, którą wyjmiemy z pudełka, jest książka, która była na górze — czyli ta, która trafiła do pudełka jako ostatnia. Oto obraz gif, który pokazuje tę zasadę.
Do czego służy struktura danych Stos?
Jednym z najważniejszych zastosowań stosu jest organizowanie wywołań podprogramów. Punkt wywoławczy na stosie przechowuje adres powrotu z podprogramu po jego zakończeniu (i ewentualnie przekazane parametry). Z każdym zagnieżdżonym (w tym rekurencyjnym) wywołaniem podprogramu do stosu dodawane są nowe adresy zwrotne. Przy każdej operacji powrotu z podprogramu (return) adres powrotu jest usuwany ze stosu i przekazywane jest do niego sterowanie. To zastosowanie jest tak ważne dla programowania, że w większości procesorów stos zwrotny jest implementowany sprzętowo w zestawie instrukcji. Jednak w innych przypadkach stos musi być oparty na bardziej ogólnych strukturach danych.Klasa Java Stack z Collection Framework
W Javie Stack to klasa z frameworka Collection, która implementuje interfejs List i rozszerza klasę Vector. Implementuje również interfejsy Collection, Iterable, Cloneable, Serializable. Jak zapewne już się domyślasz, ta klasa reprezentuje stos obiektów LIFO. Oto wywołanie konstruktora klasy Stack, czyli utworzenie obiektu tej klasy.
Stack<E> stack = new Stack<E>();
Gdzie E to typ obiektu.
Metody Java Stack
Ta klasa ma tylko jeden domyślny konstruktor i wszystkie metody klasy Vector. Dodatkowo Stack ma 5 własnych metod:boolean empty() metoda sprawdza czy stos jest pusty. Zwraca true jeśli stos jest pusty, w przeciwnym wypadku zwraca false.
Object peek() ta metoda zwraca element znajdujący się na szczycie stosu.
Object pop() ta metoda zwraca element znajdujący się na szczycie stosu i usuwa go.
Object push(Object element) ta metoda dodaje wskazany element na wierzchu stosu.
int search(Object element) metoda przeszukuje stos w poszukiwaniu określonego elementu. W przypadku znalezienia wymaganego elementu zwracana jest jego "odległość" od wierzchu stosu (numer porządkowy). Jeśli element nie zostanie znaleziony, zwracane jest -1.
Przykładowy kod stosu
Stwórzmy przykładowy program, który działa, jak na powyższym obrazku gif. Umieścimy na stosie trzy "kule", pomarańczową, fioletową i zieloną. Sprawdźmy, czy stos jest pusty. Następnie będziemy zdejmować kule ze stosu, aż będzie pusty.
import java.util.Stack;
public class myStackTest2 {
public static void main(String[] args)
{
Stack myStack= new Stack<>();
System.out.println("Czy mój stos jest pusty? " + myStack.empty());
// umieszczanie elementów na stosie
myStack.push("Pomarańczowa kula");
myStack.push("Fioletowa kula");
myStack.push("Zielona kula");
//wyświetlanie elementów stosu
System.out.println("Elementy na stosie: " + myStack);
System.out.println("Czy mój stos jest pusty? " + myStack.empty());
while (!myStack.isEmpty()) {
myStack.pop();
System.out.println("Elementy na stosie: " + myStack);
System.out.println("Czy mój stos jest pusty? " + myStack.empty());
}
}
}
Oto wynik działania programu:
import java.util.Stack;
public class myStackTest2 {
public static void main(String[] args)
{
Stack myStack= new Stack<>();
System.out.println("Czy mój stos jest pusty? " + myStack.empty());
// umieszczanie elementów na stosie
myStack.add("Pomarańczowa kula");
myStack.add("Fioletowa kula");
myStack.add("Zielona kula");
//wyświetlanie elementów stosu
System.out.println("Elementy na stosie: " + myStack);
System.out.println("Czy mój stos jest pusty? " + myStack.empty());
while (!myStack.isEmpty()) {
myStack.pop();
System.out.println("Elementy na stosie: " + myStack);
System.out.println("Czy mój stos jest pusty? " + myStack.empty());
}
}
}
Wynik pracy programu będzie oczywiście dokładnie taki sam.
A może stworzysz własną implementację stosu?
W Javie możesz stworzyć własną strukturę stosu, używając klas tablic lub połączonych list. W pierwszym przypadku do przechowywania wartości w pamięci przydzielana jest ciągła tablica komórek, które są wykorzystywane w razie potrzeby. W drugim, do każdego elementu stosu przyporządkowany jest blok pamięci, wystarczający do przechowywania wartości i odniesień do poprzedniego i następnego elementu stosu. Implementacja oparta na tablicy jest prostsza, bardziej efektywna i wydajniejsza pod względem pamięci, ale wymaga wcześniejszej znajomości limitu rozmiaru stosu i może prowadzić do trudnych do znalezienia błędów. Implementacja oparta na listach jest bardziej niezawodna, ale mniej wydajna. Stwórzmy prostą implementację stosu opartą na tablicy. Będzie ona zawierać funkcje.push — metoda, która obsłuży dodanie elementu (na wierzchu stosu)
pop — metoda, która obsłuży usunięcie elementu (z wierzchu stosu)
readTop — metoda, która zwróci element z wierzchu stosu
sEmpty — metoda, która sprawdzi czy stos jest pusty
isFull — metoda, która sprawdzi czy nasza tablica, w której przechowujemy stos, nie jest pełna
import java.util.Arrays;
public class MyStack {
private int maxSize;
private String[] stackArray;
private int top;
public MyStack(int size) {
this.maxSize = size;
stackArray = new String[maxSize];
top = -1;
}
public String push (String element) {
return stackArray[++top] = element;
}
public String pop (String element) {
if (isEmpty())
{
System.out.println("Niedomiar\nProgram zakończony");
System.exit(-1);
}
System.out.println("Usuwanie " + readTop());
return stackArray[top--];
}
public String readTop() {
return stackArray[top];
}
public boolean isEmpty() {
return (top == -1);
}
public boolean isFull() {
return (top == maxSize - 1);
}
public void printStack(){
System.out.println(Arrays.toString(stackArray));
}
}
Teraz zaimplementujmy przykład z trzema kulami w oparciu o nasz stos:
public class myStackTest {
public static void main(String[] args) {
MyStack myStack = new MyStack(3);
System.out.println("Czy mój stos jest pusty? " + myStack.isEmpty());
myStack.push("Pomarańczowa kula");
myStack.push("Fioletowa kula");
myStack.push("Zielona kula");
myStack.printStack();
System.out.println("Czy mój stos jest pusty? " + myStack.isEmpty());
while (!myStack.isEmpty()) {
myStack.pop(myStack.readTop());
System.out.println("Czy mój stos jest pusty? " + myStack.isEmpty());
}
}
}
Wyświetlone zostanie:

GO TO FULL VERSION