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.

Một hàng đợi là một cấu trúc dữ liệu linear với một bộ sưu tậ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 FIFO (First In First Out), và hàng đợi ưu tiên , có ưu tiên cho các mục trong hàng đợi xác định trật 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 Luau nào.

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 vĩnh viễn có tên là , mà bạn có thể truy cập trực tiếp các chức năng tích hợp để lấy hàng đợi và thêm, đã xemhoặc xóa dữ liệu khỏi hàng đợi.Đối với bất kỳ sử dụng nào khác, chẳng hạn như lên lịch các nhiệm vụ và xử lý yêu cầu trong trải nghiệm của bạn, bạn có thể sử dụng bảng để triển khai hàng đợi của sở hữubạn.

Hàng đợi thường xuyên

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

Thứ tự mà một hàng đợi thường xuyên 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 số ưu tiên chỉ ra lệnh đang được đọc hoặc xóa.Vật phẩm ở phía sau hàng đợi ưu tiên có ưu tiên mặc định là 0, và vật phẩm ở phía trước của hàng đợi có ưu tiên cao nhất, đó là 5 trong ví dụ sau.

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

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

Hàng đợi ưu tiên hữu ích cho 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ể đặt ưu tiên như một số lẻ khi thêm một vật phẩm, và các quá trình hàng đợi xử lý các mục có ưu tiên cao hơn trước các mục có ưu tiên thấp hơn.Ví dụ, bạn có thể sử dụng hàng đợi ưu tiên để tìm trận đấu bằng cách gán ưu tiên cao hơn cho người dùng đã chờ đợi trong thời gian dài.

Triển khai hàng đợi

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

Thực hiện một hàng đợi thường xuyên bằng cách sử dụng bảng

--!nghiêm ngặt
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ó trống không
function Queue.isEmpty<T>(self: Queue<T>)
return self._first > self._last
end
-- Thêm 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
-- Loại bỏ một giá trị khỏi hàng đợi
function Queue.dequeue<T>(self: Queue<T>): T
if self:isEmpty() then
error("Cannot dequeue from empty queue")
end
local first = self._first
local value = self._queue[first]
self._queue[first] = nil
self._first = first + 1
return value
end
return Queue

Ví dụ mã sau đây là một ví dụ sử dụng như một Script dưới Workspace .Bạn có thể sửa mã, đánh máyvà 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 có mẫu mã thực hiện trước đó được lưu trữ đúng cách.

Ví dụ sử dụng hàng đợi thường xuyên

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}
-- Loại bỏ một giá trị khỏi hàng đợi
local first = myQueue:dequeue()
print("The first value added to the queue was", first)
-- myQueue = { 10, 15}
-- Thêm thêm giá trị vào hàng đợi
myQueue:enqueue(20)
myQueue:enqueue(25)
myQueue:enqueue(30)
-- myQueue = {10, 15, 20, 25, 30}
-- Loại bỏ một giá trị khác khỏi hàng đợi
local second = myQueue:dequeue()
print("The second value added to the queue was", second)
-- myQueue = { 15, 20, 25, 30 }