堆是一個線性數據結構,包含遵循最後進最先出(LIFO)原則的一組項目。堆疊的頂端是最近新增到堆疊中的項目,底端是最近新增到堆疊中的項目。
您可以將堆疊資料結構視為一堆晚餐盤:您先從一個開始,然後再放另一個在上面。當您從堆中取出盤子時,從堆中移除的第一個盤子是堆頂上放置的最後一個盤子。
堆棧有兩個主要操作: 推 用於將元素添加到堆棧頂部,和 取出 將元素從堆棧頂部移除。堆可以有固定大小或動態縮放。堆疊對於設計使用,例如回退算法,很有用。
實裝堆疊
雖然 Luau 沒有內置的數據結構堆,但您可以使用 表 來實現堆。以下代碼示例顯示如何創建一堆、push 將對象轉換為堆和pop 從堆中創建對象。要使用此實現對您的體驗,您應該將其儲存為 ModuleScript 並將其存儲在 ReplicatedStorage 中,以便您的堆對客戶和服務伺服器都可以訪問。
local Stack = {}
Stack.__index = Stack
function Stack.new()
local self = setmetatable({}, Stack)
self._stack = {}
return self
end
-- 檢查堆是否為空
function Stack:isEmpty()
return #self._stack == 0
end
-- 將新值放置於堆疊上
function Stack:push(value)
table.insert(self._stack, value)
end
-- 從堆中取得值
function Stack:pop()
if self:isEmpty() then
return nil
end
return table.remove(self._stack, #self._stack)
end
return Stack
以下代碼示例是作為 Script 在 Workspace 下的使用示例。您可以修改代碼、輸入和儲存位置,以符合自己的使用需求,只要您有以前的實裝代碼樣本正確存儲即可。
堆疊使用示例
local ReplicatedStorage = game:GetService("ReplicatedStorage")local Stack = require(ReplicatedStorage:WaitForChild("Stack"))local s = Stack.new()-- 變更堆結果堆輸出s: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
如果你沒有更改任何東西地執行以前的代碼樣本,預期的輸出是:
範例輸出
105201