スタックは、最後に入って最初に出る (LIFO) 原則に従うアイテムのコレクションを持つ線形データ構造です。スタックの上部は最も最近追加されたアイテムであり、スタックの下部は最も最近追加されたアイテムです。
スタックデータ構造を夕食の皿のスタックと考えることができます:最初は 1 つを開始し、その上に別のものを置きます。スタックからプレートを取り出すと、スタックから削除する最初の 1 は、トップに置く最後の 1 です。
スタックには 2つのメイン操作があります: 押す でスタックの頂上に要素を追加し、 押す で要素をスタックの頂上から削除します。スタックには固定サイズがあるか、動的にサイズが変更されることがあります。スタックは、バックトラックアルゴリズムなどのデザイン使用に便利です。
スタックを実装
Luau には内蔵データ構造としてスタックがありませんが、テーブル を使用してスタックを実装できます。次のコードサンプルでは、スタックを作成する方法、 オブジェクトをスタックに配置する方法、およびスタックからオブジェクトを取得する方法を示しています。この実装をエクスペリエンスに使用するには、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
次のコードサンプルは、 の下での使用例です。以前の実装コードサンプルを適切に保存している限り、コード、入力イプ、およびストレージの場所を自分の使用に合わせて変更できます。
スタック使用例
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