排隊

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

佇列是一種線性數據結構,包含一系列項目。 Roblox 上有兩種類型的佇列:常規佇列,遵循先進先出 (FIFO) 原則,和 優先佇列,其具有優先級,用以決定數據的存取順序。兩種類型的佇列中的項目都可以是任何 Luau 數據類型

佇列是名為 MemoryStoreService非持久數據存儲 服務提供的內建數據結構,您可以直接調用內建函數來獲取佇列並向佇列添加、讀取或刪除數據。對於其他用途,例如在遊戲中安排任務和處理請求,您可以使用表來自行實現佇列。

常規佇列

常規佇列在 FIFO 序列中維持,所有項目都會添加到佇列的末尾,並按照添加的順序從前面到後面讀取或刪除。

常規佇列添加、讀取和刪除項目的順序

優先佇列

優先佇列不遵循 FIFO 規則,每個項目都可以帶有一個優先級數字,指示其被讀取或刪除的順序。 在優先佇列的末尾的項目具有默認優先級 0,而在佇列前面的項目則具有最高的設置優先級,在以下示例中為 5。

項目的設置優先級改變了佇列讀取項目的順序

在此示例中,設置優先級為 3 的項目將被添加到佇列中。佇列將新項目放在所有已有項目之後,其設置優先級必須為 3 或更高。要將項目放在佇列的最前面,您需要將優先級設置為高於當前的最高設置優先級。在此示例中,您需要將優先級設置為 6 或更高。

優先佇列在需要根據重要性順序而不是添加順序來讀取或訪問數據的情況下非常有用。您可以在添加項目時將優先級設置為整數,佇列會先處理優先級較高的項目,然後是優先級較低的項目。例如,您可以為長時間等待的用戶分配較高的優先級,將優先佇列用於配對。

實現佇列

您可以使用 MemoryStoreService 的內建佇列,或使用 來實現其他所有用途的佇列。以下代碼示例展示了 常規佇列 的實現。要在您的遊戲中使用此實現,您應該將其保存為 ModuleScript,並將其存儲在 ReplicatedStorage 中,以便您的佇列可以對客戶端和服務器均可訪問。

使用表實現常規佇列

--!strict
local Queue = {}
Queue.__index = Queue
export type Queue<T> = typeof(setmetatable(
{} :: {
_first: number,
_last: number,
_queue: { T },
},
Queue
))
function Queue.new<T>(): Queue<T>
local self = setmetatable({
_first = 0,
_last = -1,
_queue = {},
}, Queue)
return self
end
-- 檢查佇列是否為空
function Queue.isEmpty<T>(self: Queue<T>)
return self._first > self._last
end
-- 向佇列添加值
function Queue.enqueue<T>(self: Queue<T>, value: T)
local last = self._last + 1
self._last = last
self._queue[last] = value
end
-- 從佇列中移除值
function Queue.dequeue<T>(self: Queue<T>): T
if self:isEmpty() then
error("無法從空的佇列中出隊")
end
local first = self._first
local value = self._queue[first]
self._queue[first] = nil
self._first = first + 1
return value
end
return Queue

以下代碼示例是作為 Script 放置於 Workspace 下的使用示例。您可以根據自己的用途修改代碼、類型和存儲位置,只要您將之前的實現代碼樣本正確存儲即可。

常規佇列使用示例

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Queue = require(ReplicatedStorage:WaitForChild("Queue"))
local myQueue = Queue.new()
-- 向佇列添加一些值
myQueue:enqueue(5)
myQueue:enqueue(10)
myQueue:enqueue(15)
-- myQueue = { 5, 10, 15 }
-- 從佇列中移除一個值
local first = myQueue:dequeue()
print("添加到佇列的第一個值是", first)
-- myQueue = { 10, 15 }
-- 向佇列添加更多值
myQueue:enqueue(20)
myQueue:enqueue(25)
myQueue:enqueue(30)
-- myQueue = { 10, 15, 20, 25, 30 }
-- 再從佇列中移除一個值
local second = myQueue:dequeue()
print("添加到佇列的第二個值是", second)
-- myQueue = { 15, 20, 25, 30 }
©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。