[C#] 자료 구조 – Queue

[C#] 자료 구조 – Queue

개요

이번 글에서는 C#에서 Queue에 대해 알아보겠습니다. C#에서 큐를 사용하기 위해서는 Queue<T> 제네릭 컬렉션 클래스를 사용하고, 이 클래스는 FIFO(First In First Out) 구조를 따릅니다. T에는 모든 타입의 자료형을 넣을 수 있습니다. 만약 여러 스레드에서 동시에 액세스해야 하는 경우 ConcurrentQueue<T>를 사용합니다.

선언

Queue<T>를 선언하는 방법은 아래와 같습니다.

Queue<T> queue = new Queue<T>();

큐를 설명하기에는 프린트 대기열 구현하는 것 만큼 적합한 예제는 별로 없습니다. 프린터는 FIFO의 대표적인 예시로 먼저 들어온 작업을 출력합니다. 이 예시로 설명 하겠습니다. T에 출력 될 문서를 의미하는 CPrintDocument 클래스를 만들어줍니다.

class CPrintDocument
{
    private string m_strDocument;
    public string DOCUMENT
    {
        get
        {
            return m_strDocument;
        }
    }

    public CPrintDocument(string strName)
    {
        m_strDocument = strName;
    }

    public override string ToString()
    {
        return $"document name[{DOCUMENT}]";
    }
}

Queue<CPrintDocument> queuePrint = new Queue<CPrintDocument>(); // Queue 생성

추가

큐에 요소를 추가하는 방법은 Enqueue 함수를 사용하면 됩니다.

queuePrint.Enqueue(new CPrintDocument("보고서.pdf"));
queuePrint.Enqueue(new CPrintDocument("사진.jpg"));
queuePrint.Enqueue(new CPrintDocument("계약서.docx"));
queuePrint.Enqueue(new CPrintDocument("정리.xlsx"));

이렇게 입력된 큐를 foreach를 사용하여 조회할 수 있습니다.

foreach (CPrintDocument person in queuePrint)
{
    Console.WriteLine(person.ToString());
}

요소 반환

큐에서 요소를 받기 위해서는 Peek 또는 Dequeue 함수를 사용하면 됩니다. Peek은 큐에서 제거하지 않고 반환하는 방법이고, Dequeue는 큐에서 제거하면서 반환하는 방식 입니다.

// 제거 없이 요소 반환
Console.WriteLine($"첫 번째 문서 확인: {queuePrint.Peek()}");

// 요소 제거 및 반환
Console.WriteLine($"첫번째 문서 출력 중 ...: {queuePrint.Dequeue()}");
Console.WriteLine("출력이 완료 되었습니다.");
Console.WriteLine($"두번째 문서 출력 중 ...: {queuePrint.Dequeue()}");
Console.WriteLine("출력이 완료 되었습니다.");

요소 개수, 존재 유무 확인

큐에 요소 개수를 확인하기 위해서 Count 속성을 사용하면 됩니다.

Console.WriteLine($"남은 문서 수: {queuePrint.Count}");

큐에 요소의 존재 유무를 확인 하기 위해서는 Contains 함수를 사용하면 됩니다.

CPrintDocument clsContain = queuePrint.Peek();
bool bContain = queuePrint.Contains(clsContain);
Console.WriteLine($"{clsContain} 문서 존재 유무 : {bContain}");

배열에 복사

큐에 있는 요소를 새 배열에 복사하는 방법은 ToArray 함수를 사용하면 됩니다.

CPrintDocument[] arr = queuePrint.ToArray();
foreach (CPrintDocument person in arr)
{
    Console.WriteLine(person.ToString());
}

요소 삭제

큐에서 요소를 삭제하는 방법은 Clear 함수를 사용하면 됩니다.

queuePrint.Clear();

github : https://github.com/3001ssw/c_sharp/tree/main/Data_Struct/Queue