Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

เมธอด Queue.Enqueue() ใน C# : เพิ่มสมาชิกเข้าไปที่ท้ายคิว

เมธอด 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)