Stos to liniowa struktura danych z kolekcją elementów, która przestrzega zasady Last-In-First-Out (LIFO). Górna część stosu to element, który został niedawno dodany do stosu, a dolna część stosu to element, który został dodany najwcześniej.
Możesz pomyśleć o strukturze danych stosu jak o stosie talerzy obiadowych: zaczynasz od jednego, a następnie kładziesz na nim kolejny. Kiedy zabierasz talerze ze stosu, pierwszy talerz, który usuniesz ze stosu, to ostatni talerz, który położyłeś na górze.
Stosy mają dwie główne operacje: push, aby dodać element na szczyt stosu, oraz pop, aby usunąć element ze szczytu stosu. Stos może mieć albo stały rozmiar, albo być dynamicznie zmieniany. Stosy są pomocne w takich zastosowaniach jak algorytmy przeszukiwania wstecznego.
Implementacja stosów
Chociaż Luau nie ma stosów jako wbudowanej struktury danych, możesz użyć tabel, aby zaimplementować stosy. Poniższy przykład kodu pokazuje, jak stworzyć stos, dodać obiekt do stosu za pomocą push oraz usunąć obiekt ze stosu za pomocą pop. Aby użyć tej implementacji w swojej grze, powinieneś zapisać ją jako ModuleScript i przechować w ReplicatedStorage, aby twój stos był dostępny zarówno dla klienta, jak i serwera.
local Stack = {}
Stack.__index = Stack
function Stack.new()
local self = setmetatable({}, Stack)
self._stack = {}
return self
end
-- Sprawdź, czy stos jest pusty
function Stack:isEmpty()
return #self._stack == 0
end
-- Umieść nową wartość na stosie
function Stack:push(value)
table.insert(self._stack, value)
end
-- Weź wartość ze stosu
function Stack:pop()
if self:isEmpty() then
return nil
end
return table.remove(self._stack, #self._stack)
end
return Stack
Poniższy przykład kodu to przykład użycia jako Script w Workspace. Możesz zmodyfikować kod, typ i miejsce przechowywania, aby pasowały do twojego zastosowania, o ile masz wcześniej zaimplementowany kod w odpowiednim miejscu.
Przykład użycia stosulocal ReplicatedStorage = game:GetService("ReplicatedStorage")local Stack = require(ReplicatedStorage:WaitForChild("Stack"))local s = Stack.new()-- Zmień stos Rezultujący stos Wyjścies:push(1) -- {1}s:push(5) -- {1, 5}s:push(10) -- {1, 5, 10}print(s:pop()) -- {1, 5} 10print(s:pop()) -- {1} 5s:push(20) -- {1, 20}print(s:pop()) -- {1} 20print(s:pop()) -- {} 1
Jeśli uruchomisz poprzedni przykład kodu bez wprowadzania zmian, oczekiwane wyjście to:
Przykład wyjścia105201