[PHP] Jak wykonać obsługę stosu (First In, Last Out) korzystając z własnej klasy?
Chcesz zaimplementować obsługę stosu, gdzie pierwszy położony element zostanie ściągnięty jako ostatni.
Stos to podstawowa struktura danych w informatyce. Przypomina ona nieco stos klocków, gdzie klocki można dodawać tylko na samą górę i zdejmować też tylko z samej góry. Aby dostać się do klocka na dole, trzeba zdjąć wszystkie z góry. Stos służy do odkładania (zwykle na chwilę) określonych wartości.
Realizacja stosu nie jest skomplikowana i sprowadza się do użycia funkcji obsługujących tablice. Takie rozwiązanie jest wystarczające do prostych zastosowań, ale znacznie wygodniejsze jest korzystanie z klas i obiektów, jak w poniższym przykładzie.
class stos {
var $tablica;
function dodaj($element) {
$this->tablica[] = $element;
}
function usun() {
return array_pop($this->tablica);
}
function ile() {
return count($this->tablica);
}
function pokaz() {
$ile=$this->ile();
for ($i=0;$i<$ile;$i++) echo $this->tablica[$i]."<br>";
}
}
$stos1 = new stos(); echo "<br>Stworzenie stosu";
$stos1->dodaj("Piotr"); echo "<br>Dodano na stos: Piotr";
$stos1->dodaj("Marek"); echo "<br>Dodano na stos: Marek";
$stos1->dodaj("Iwona"); echo "<br>Dodano na stos: Iwona";
$usuniety = $stos1->usun(); echo "<br>Usunięto ze stosu: $usuniety";
$jest= $stos1->ile(); echo "<br>Elementów na stosie: $jest";
$stos1->dodaj("Michał"); echo "<br>Dodano na stos: Michał";
$usuniety = $stos1->usun(); echo "<br>Usunięto ze stosu: $usuniety";
$usuniety = $stos1->usun(); echo "<br>Usunięto ze stosu: $usuniety";
$jest= $stos1->ile(); echo "<br>Elementów na stosie: $jest";
$stos1->dodaj("Katarzyna"); echo "<br>Dodano na stos: Katarzyna";
$stos1->dodaj("Anna"); echo "<br>Dodano na stos: Anna";
$usuniety = $stos1->usun(); echo "<br>Usunięto ze stosu: $usuniety";
$jest= $stos1->ile(); echo "<br>Elementów na stosie: $jest";
echo "<p>";
echo $stos1->pokaz();
Stwórzmy sobie klasę o nazwie stos, która będzie zawierała jedno pole - tablicę o nazwie tablica. Teraz wystarczy stworzyć metody umożliwiające dodanie elementu do stosu dodaj() i zdjęcie elementu ze stosu usun() i zwrócenie go.
Dodałem jeszcze dwie pomocnicze metody - ile() określającą ile elementów mamy aktualnie na stosie i pokaz(), która wypisuje zawartość stosu. Nie są one konieczne, aby stos działał poprawnie.
Funkcja array_pop() pobiera i kasuje ostatni element tablicy. Dodawanie elementu do tablicy nie wymaga nawet stosowania jakichkolwiek funkcji. W zasadzie bez tworzenia klas wszystko też działałoby poprawnie, więc dlaczego upierałem się przy zastosowaniu klasy?
Klasa jest wygodna gdy chcesz mieć kilka niezależnych stosów. Możemy zadeklarować kilka zmiennych typu stos i operować na nich za pomocą metod. Może być wiec stos1, stos2 itd.
To również wygodny sposób na zmianę zachowania poszczególnych metod - w starszych wersjach języka PHP nie ma funkcji array_pop() i trzeba napisać ręczną obsługę zwracania elementu z tablicy. O wiele łatwiej wykonać ją w klasach (modyfikując jedną metodę).
Poniżej kodu znajdziesz przykład wykorzystujący klasę do manipulowania zawartością stosu - bardzo łatwo można dodawać i usuwać elementy ze stosu. W naszym wypadku na stos wędrowały imiona.
Nasza klasa nie ma konstruktora, bo nie był potrzebny. Metoda ile() może przydać się do sprawdzania czy stos nie jest przepełniony, jeżeli zakładasz, iż powinien osiągnąć tylko określoną ilość elementów.