Hàng đợi

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Hàng đợi là một cấu trúc dữ liệu tuyến tính với một tập hợp các mục. Có hai loại hàng đợi trên Roblox: hàng đợi thông thường, tuân theo nguyên tắc nhập trước xuất trước (FIFO), và hàng đợi ưu tiên, có các mức độ ưu tiên cho các mục trong hàng đợi xác định thứ tự truy cập dữ liệu. Các mục trong cả hai loại hàng đợi có thể là bất kỳ loại dữ liệu nào của Luau.

Hàng đợi là một cấu trúc dữ liệu tích hợp của dịch vụ lưu trữ dữ liệu không bền vững được gọi là MemoryStoreService, mà bạn có thể gọi trực tiếp các hàm tích hợp để lấy một hàng đợi và thêm, đọc hoặc xóa dữ liệu từ hàng đợi. Đối với bất kỳ mục đích sử dụng nào khác, chẳng hạn như lập lịch tác vụ và xử lý yêu cầu trong trò chơi của bạn, bạn có thể sử dụng bảng để tự triển khai hàng đợi.

Hàng đợi thông thường

Hàng đợi thông thường được duy trì theo thứ tự FIFO, trong đó tất cả các mục được thêm vào phía sau hàng đợi và được đọc hoặc xóa theo cùng một thứ tự mà chúng được thêm vào, từ đầu đến cuối.

Thứ tự mà một hàng đợi thông thường thêm, đọc và xóa các mục

Hàng đợi ưu tiên

Hàng đợi ưu tiên không tuân theo quy tắc FIFO, trong đó mỗi mục có thể được thêm với một số mức độ ưu tiên chỉ ra thứ tự được đọc hoặc xóa. Mục ở phía cuối của một hàng đợi ưu tiên có mức độ ưu tiên mặc định là 0, và mục ở phía trước của hàng đợi có mức độ ưu tiên cao nhất được thiết lập, là 5 trong ví dụ dưới đây.

Mức độ ưu tiên được thiết lập của một mục thay đổi thứ tự mà hàng đợi đọc các mục

Trong ví dụ này, một mục với mức độ ưu tiên được thiết lập là 3 đang được thêm vào một hàng đợi. Hàng đợi đặt mục mới đứng sau tất cả các mục hiện có với mức độ ưu tiên được thiết lập là 3 hoặc cao hơn. Để đặt một mục ở phía trước của hàng đợi, bạn cần thiết lập mức độ ưu tiên cao hơn mức độ ưu tiên cao nhất hiện tại. Trong ví dụ này, bạn cần thiết lập mức độ ưu tiên là 6 hoặc cao hơn.

Hàng đợi ưu tiên rất hữu ích trong các tình huống mà bạn muốn đọc hoặc truy cập dữ liệu dựa trên thứ tự quan trọng thay vì thứ tự được thêm vào. Bạn có thể thiết lập một mức độ ưu tiên dưới dạng số nguyên khi thêm một mục, và hàng đợi xử lý các mục có mức độ ưu tiên cao hơn trước các mục có mức độ ưu tiên thấp hơn. Ví dụ, bạn có thể sử dụng hàng đợi ưu tiên cho việc ghép đội bằng cách gán mức độ ưu tiên cao hơn cho những người dùng đã chờ đợi lâu.

Triển khai hàng đợi

Bạn có thể sử dụng các hàng đợi tích hợp của MemoryStoreService hoặc sử dụng bảng để triển khai hàng đợi cho tất cả các mục đích sử dụng khác. Mẫu mã sau đây cho thấy việc triển khai một hàng đợi thông thường. Để sử dụng việc triển khai này cho trò chơi của bạn, bạn nên lưu nó dưới dạng ModuleScript và lưu trữ nó trong ReplicatedStorage, để hàng đợi của bạn có thể truy cập được cho cả máy khách và máy chủ.

Triển khai Hàng Đợi Thông Thường Sử Dụng Bảng

--!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
-- Kiểm tra xem hàng đợi có rỗng không
function Queue.isEmpty<T>(self: Queue<T>)
return self._first > self._last
end
-- Thêm một giá trị vào hàng đợi
function Queue.enqueue<T>(self: Queue<T>, value: T)
local last = self._last + 1
self._last = last
self._queue[last] = value
end
-- Xóa một giá trị từ hàng đợi
function Queue.dequeue<T>(self: Queue<T>): T
if self:isEmpty() then
error("Không thể xóa từ hàng đợi rỗng")
end
local first = self._first
local value = self._queue[first]
self._queue[first] = nil
self._first = first + 1
return value
end
return Queue

Mẫu mã sau đây là một ví dụ sử dụng dưới dạng Script trong Workspace. Bạn có thể sửa đổi mã, kiểu dữ liệu và vị trí lưu trữ để phù hợp với mục đích sử dụng của riêng bạn, miễn là bạn đã lưu mã triển khai mẫu trước đó đúng cách.

Ví dụ Sử Dụng Hàng Đợi Thông Thường

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Queue = require(ReplicatedStorage:WaitForChild("Queue"))
local myQueue = Queue.new()
-- Thêm một số giá trị vào hàng đợi
myQueue:enqueue(5)
myQueue:enqueue(10)
myQueue:enqueue(15)
-- myQueue = { 5, 10, 15 }
-- Xóa một giá trị từ hàng đợi
local first = myQueue:dequeue()
print("Giá trị đầu tiên được thêm vào hàng đợi là", first)
-- myQueue = { 10, 15 }
-- Thêm nhiều giá trị hơn vào hàng đợi
myQueue:enqueue(20)
myQueue:enqueue(25)
myQueue:enqueue(30)
-- myQueue = { 10, 15, 20, 25, 30 }
-- Xóa một giá trị khác từ hàng đợi
local second = myQueue:dequeue()
print("Giá trị thứ hai được thêm vào hàng đợi là", second)
-- myQueue = { 15, 20, 25, 30 }
©2026 Roblox Corporation. Roblox, logo Roblox và Powering Imagination là các nhãn hiệu đã đăng ký và chưa đăng ký của chúng tôi tại Hoa Kỳ và các quốc gia khác.