เมธอด Queue<T>.Enqueue() ใน C# ใช้เพิ่มออบเจ็กต์เข้าไปที่ ท้ายคิว (rear/back) ตามหลักการ FIFO (First-In-First-Out) สมาชิกที่เพิ่มล่าสุดจะถูก Dequeue ออกสุดท้าย
รูปแบบไวยากรณ์ (Syntax)
public void Enqueue(T item);
item: ออบเจ็กต์ที่ต้องการเพิ่มเข้า Queue
ตัวอย่างที่ 1: Enqueue, Dequeue, Clear
using System;
using System.Collections.Generic;
public class Demo
{
public static void Main()
{
Queue queue = new Queue();
queue.Enqueue("Gary");
queue.Enqueue("Jack");
queue.Enqueue("Ryan");
queue.Enqueue("Kevin");
queue.Enqueue("Mark");
queue.Enqueue("Jack");
queue.Enqueue("Ryan");
queue.Enqueue("Kevin");
Console.Write("Count = ");
Console.WriteLine(queue.Count);
Console.WriteLine("Queue... (front to back)");
foreach (string i in queue)
{
Console.WriteLine(i);
}
// Dequeue 2 ตัว (Gary, Jack ออก)
queue.Dequeue();
queue.Dequeue();
Console.WriteLine("\nQueue...UPDATED (after 2 Dequeues)");
foreach (string i in queue)
{
Console.WriteLine(i);
}
Console.Write("Count (updated) = " + queue.Count);
queue.Clear();
Console.Write("\nCount after Clear = ");
Console.WriteLine(queue.Count);
}
}
ผลลัพธ์
Count = 8 Queue... (front to back) Gary Jack Ryan Kevin Mark Jack Ryan Kevin Queue...UPDATED (after 2 Dequeues) Ryan Kevin Mark Jack Ryan Kevin Count (updated) = 6 Count after Clear = 0
ตัวอย่างที่ 2: Enqueue เพิ่มเติม แล้ว Dequeue
using System;
using System.Collections.Generic;
public class Demo
{
public static void Main()
{
Queue queue = new Queue();
queue.Enqueue("Gary");
queue.Enqueue("Jack");
queue.Enqueue("Ryan");
queue.Enqueue("Kevin");
queue.Enqueue("Mark");
Console.WriteLine("Queue... (initial)");
foreach (string i in queue)
{
Console.WriteLine(i);
}
Console.Write("Count = ");
Console.WriteLine(queue.Count);
// เพิ่มอีก 3 ตัว
queue.Enqueue("Jack");
queue.Enqueue("Ryan");
queue.Enqueue("Kevin");
Console.WriteLine("\nQueue...UPDATED (after 3 more Enqueues)");
foreach (string i in queue)
{
Console.WriteLine(i);
}
Console.Write("Count (updated) = ");
Console.WriteLine(queue.Count);
// Dequeue 2 ตัว
queue.Dequeue();
queue.Dequeue();
Console.WriteLine("\nQueue...UPDATED (after 2 Dequeues)");
foreach (string i in queue)
{
Console.WriteLine(i);
}
Console.Write("Count = ");
Console.WriteLine(queue.Count);
queue.Clear();
Console.Write("\nCount after Clear = ");
Console.WriteLine(queue.Count);
}
}
ผลลัพธ์
Queue... (initial) Gary Jack Ryan Kevin Mark Count = 5 Queue...UPDATED (after 3 more Enqueues) Gary Jack Ryan Kevin Mark Jack Ryan Kevin Count (updated) = 8 Queue...UPDATED (after 2 Dequeues) Ryan Kevin Mark Jack Ryan Kevin Count = 6 Count after Clear = 0
สรุปและข้อสังเกต
Enqueue()เพิ่มที่ท้าย (Rear),Dequeue()ดึงจากหน้า (Front)- Complexity: O(1) Amortized (อาจ resize array ภายใน)
- รองรับค่า null และ duplicate values
- Non-generic Queue.Enqueue(object) ต้อง boxing/unboxing สำหรับ value types
- Generic
Queue<T>แนะนำใช้แทน non-generic เพื่อ type safety และ performance - Thread-safe version:
ConcurrentQueue<T>(Enqueue/TryDequeue เป็น atomic)
โครงสร้างข้อมูล Queue ภายใน
Queue ใน .NET ใช้ Circular Buffer (Ring Buffer) บน Array:
- มี head index (front) และ tail index (rear)
- Enqueue: เขียนที่ tail, เพิ่ม tail (mod capacity)
- Dequeue: อ่านที่ head, เพิ่ม head (mod capacity)
- เมื่อเต็ม: จัดสรร Array ใหญ่ขึ้น 2 เท่า และคัดลอก (Resize)