スタックは、後入れ先出し (LIFO) の原則に従うアイテムのコレクションを持つ線形データ構造です。スタックの上部はスタックに最近追加されたアイテムであり、スタックの下部は最も最近追加されていないアイテムです。
スタックをディナープレートの積み重ねとして考えることができます:一つのプレートから始め、次にその上に別のプレートを置きます。スタックからプレートを取るとき、スタックから最初に取り出すのは、一番上に置いた最後のプレートです。
スタックには、スタックの上に要素を追加するための push と、スタックの上から要素を取り除くための pop の2つの主要な操作があります。スタックは固定サイズを持つか、動的にサイズを変更することができます。スタックは、バックトラッキングアルゴリズムのような設計用途で便利です。
スタックの実装
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