대기열은 항목 컬렉션을 가진 직선적인 데이터 구조입니다. Roblox에는 두 가지 종류의 대기열이 있습니다: 일반 대기열, 즉 첫 번째 순위를 따르는 첫 번째 출력 순서를 따르며, 우선 대기열, 즉 순위를
대기열은 비동기 데이터 저장 서비스의 내장 데이터 구조로, 이 서비스에서 직접 대기열 함수를 호출하여 데이터를 추가하고 읽음제거합니다. 다른 용도, 예를 들어 작업 예약 및 처리 요청 처리에 대해, 테이블을 사용하여 대기열을
일반 대기열
일반적인 대기열은 FIFO 순서대로 유지 관리되며, 모든 항목이 대기열의 뒷부분에 추가되고 대기열에서 읽거나 제거되며 앞에서 종료동일한 순서로 읽거나 제거됩니다.
우선 순위 큐
우선 큐는 FIFO 규칙을 따르지 않습니다, 여기서 각 항목은 우선 순위 번호를 가진 순서대로 읽거나 제거할 수 있습니다. 우선 큐의 뒷부분에 있는 항목은 기본 우선 순위가 0이며, 앞부분의 항목은 최대 우선 순위가 5입니다. 다음 예에서 볼 수 있듯이.
이 예에서는 3개의 우선 순위가 있는 항목이 큐에 추가됩니다. 큐는 3개 이상의 우선 순위가 있는 모든 항목을 가진 새 항목을 큐의 뒤에 배치합니다. 큐의 머리에 아이템을 배치하려면 현재 최고 우선 순위보다 우선 순위를 높여야 합니다. 이 예
우선 순위 큐는 순서가 아닌 순서로 데이터를 읽거나 액세스하려는 경우에 유용합니다. 우선 순위 큐를 아이템추가할 때 정렬하는 순서가 아닌 순서로 데이터를 읽거나 액세스하려면 정수를 우선 순위로 설정할 수 있습니다. 예를 들어, 더 많은 시간
대기열 구현
Class.MemoryStoreService 의 내장 대기열을 사용하거나 모든 다른 사용을 위해 테이블을 사용하여 대기열을 구현할 수 있습니다. 다음 코드 샘플은 구현을 위해 정규 대기열 을 저장하고
테이블을 사용하여 정규 큐 구현
--!엄격
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("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
다음 코드 샘플은 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)-- 내 큐 = { 5, 10, 15}-- 대기열에서 하나의 값을 제거local first = myQueue:Dequeue()print("The first value added to the queue was", first)-- 내 큐 = { 10, 15}-- 대기열에 값 추가myQueue:Enqueue(20)myQueue:Enqueue(25)myQueue:Enqueue(30)-- 내 대기열 = { 10, 15, 20, 25, 30}-- 대기열에서 다른 값을 제거local second = myQueue:Dequeue()print("The second value added to the queue was", second)-- myQueue = { 15, 20, 25, 30 }