佇列 是「先進先出」 (FIFO, First In First Out) 的資料結構。就像排隊買票:最先排隊的人,最先買到票離開。Delphi 2009 的 TQueue<T> 提供泛型強型別支援,適用於:

| 方法/屬性 | 說明 | 備註 |
|---|---|---|
Enqueue(item) | 加入元素到佇列尾端 | 無回傳值 |
Dequeue | 移除並回傳佇列前端元素 | 回傳 T,空佇列會拋出例外 |
Peek | 查看佇列前端元素不移除 | 回傳 T,空佇列會拋出例外 |
Count | 目前元素總數 | 唯讀屬性 |
Clear | 清空佇列 | 不釋放元素物件 (除非用 TObjectQueue) |
ToArray | 轉為陣列 (前端在前) | 回傳 TArray<T> |
type
TRec = record
Name: string;
Age: Word;
end;
var
Queue: TQueue<TRec>;
procedure TForm1.FormCreate(Sender: TObject);
begin
Queue := TQueue<TRec>.Create;
Memo1.Clear;
Button1.Caption := '入列';
Button2.Caption := '出列';
Button3.Caption := '查看下一個出列';
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Queue.Free;
end;
// 入列
procedure TForm1.Button1Click(Sender: TObject);
var
rec: TRec;
begin
rec.Name := StringOfChar(Char(65 + Random(26)), 3);
rec.Age := Random(150);
Queue.Enqueue(rec);
Caption := Format('目前佇列筆數: %d', [Queue.Count]);
Memo1.Lines.Add(Format('%s, %d', [rec.Name, rec.Age])); // 同步顯示 (新增在最後)
end;
// 出列
procedure TForm1.Button2Click(Sender: TObject);
var
rec: TRec;
begin
if Queue.Count = 0 then Exit;
rec := Queue.Dequeue;
ShowMessage(Format('出列: %s, %d', [rec.Name, rec.Age]));
Caption := Format('目前佇列筆數: %d', [Queue.Count]);
Memo1.Lines.Delete(0); // 移除第一行 (對應佇列前端)
end;
// 查看前端
procedure TForm1.Button3Click(Sender: TObject);
var
rec: TRec;
begin
if Queue.Count = 0 then Exit;
rec := Queue.Peek;
ShowMessage(Format('前端元素: %s, %d', [rec.Name, rec.Age]));
end;
var
TaskQueue: TQueue<TTask>;
procedure Producer;
var i: Integer;
begin
for i := 1 to 100 do
TaskQueue.Enqueue(TTask.Create(i)); // 產生任務
end;
procedure Consumer;
var task: TTask;
begin
while TaskQueue.Count > 0 do
begin
task := TaskQueue.Dequeue;
try
task.Execute;
finally
task.Free;
end;
end;
end;
procedure BFS(start: TGraphNode);
var
queue: TQueue<TGraphNode>;
node, neighbor: TGraphNode;
begin
queue := TQueue<TGraphNode>.Create;
try
queue.Enqueue(start);
start.Visited := True;
while queue.Count > 0 do
begin
node := queue.Dequeue;
ProcessNode(node);
for neighbor in node.Neighbors do
if not neighbor.Visited then
begin
neighbor.Visited := True;
queue.Enqueue(neighbor);
end;
end;
finally
queue.Free;
end;
end;
type
TCircularBuffer<T> = class
private
FQueue: TQueue<T>;
FMaxSize: Integer;
public
constructor Create(MaxSize: Integer);
procedure Push(item: T);
function Pop: T;
property Count: Integer read FQueue.Count;
end;
procedure TCircularBuffer<T>.Push(item: T);
begin
if FQueue.Count = FMaxSize then FQueue.Dequeue; // 滿則移除最舊
FQueue.Enqueue(item);
end;
| 操作 | TQueue (FIFO) | TStack (LIFO) |
|---|---|---|
| 加入 | Enqueue (尾端) | Push (頂端) |
| 移除 | Dequeue (前端) | Pop (頂端) |
| 查看 | Peek (前端) | Peek (頂端) |
| Memo 同步 | Delete(0) 移除首行 | Delete(Count-1) 移除尾行 |
| 典型用途 | 排程、BFS、緩衝 | Undo、DFS、運算式求值 |
Enqueue/Dequeue 皆為 O(1) 平攤時間TQueue<T>.Create(Capacity) 減少記憶體重新分配TQueue<TRec> 避免物件管理負擔,適合高頻資料流TMonitor 或關鍵區段保護TQueue<T> 以泛型封裝高效能 FIFO 結構,配合環狀陣列實作與簡潔 API,是處理排程、遍歷、緩衝等循序資料流程的首選工具。掌握 Enqueue/Dequeue/Peek 三大核心操作,即可靈活應對各類佇列場景。