堆叠是一个线性数据结构,其中以下项目是按“最后在最初”(LIFO)原则添加到堆叠的。顶部的堆叠是最后添加到堆叠的项目,底部的堆叠是最不давно添加到堆叠的项目。
您可以将堆叠数据结构想象为一个叠卧的餐盘:你从一个开始,然后你将另一个放在它上面。当你从堆叠数据结构中移除一枚时,最先 移除 的是最后 放 在最上面的一枚。
堆有两个主要操作: 推 用于将元素添加到堆的顶部, 弹 用于从堆的顶部移除元素。堆可以有固定大小或动态调整大小。堆有助于设计用途,例如返回跟踪算法。
实现堆叠
虽然 Luau 不是一个内置数据结构,但您可以使用 表 来实现堆。以下代码示例显示如何创建堆, push 一个对象到堆,和 pop 一个对象从堆。要使用此实现
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) --s:Push(5) -- ,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}版print(s:Pop()) -- {} 1
如果您运行以前的代码示例,无需更改任何内容,预期输出是:
示例输出
105201