堆疊是一種線性資料結構,其集合的項目遵循後進先出 (LIFO) 原則。堆疊的頂部是最近添加到堆疊的項目,而堆疊的底部則是最早添加的項目。
你可以將堆疊資料結構想像成一疊餐盤:你從一個開始,然後再在上面放一個。當你從堆疊中取出盤子時,你最先從堆疊中移除的將是你最後放在頂部的那個。
堆疊有兩個主要操作:push 用於將元素添加到堆疊的頂部,pop 用於從堆疊的頂部移除元素。堆疊可以是固定大小或動態調整大小的。堆疊對於後退算法等設計用途非常有幫助。
實作堆疊
儘管 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
以下程式碼示例是一個在 Workspace 下的 Script 的使用範例。你可以修改程式碼、類型和儲存位置以滿足你自己的需求,只要你正確地儲存了之前的實作程式碼示例。
堆疊使用範例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