C# - Queue

2024. 5. 2. 19:57C#/C# 학습정리

Stack을 했으면 빠질 수 없는 자료구조 Queue이다. Stack처럼 데이터를 일정한 방식으로 관리를 하는데 Queue는 선입선출 FIFO(First-in-First-out)구조이다. 먼저 들어온데이터가 제일 먼저 빠져나가는 방식이다. 흔히 게임을 할 때 대기실에서 매칭을 할 때 큐를 잡는다고 표현한다. 이때 큐가 선입선출의 구조를 가진 Queue를 뜻한다.

 

목차

  1. Queue의 작동방식
  2. Queue 사용법

     

     


    Queue의 작동방식

    Queue는 Stack과 마찬가지로 제너릭 형태이다. Queue<T> 클래스를 C#에서 지원하고있다. 선입선출(FIFO)를 기반으로 한 자료구조로 순서대로 처리해야할 경우에 유용한 자료구조이다. Enqueue를 통해 처리해야할 데이터를 집어넣고, Dequeue를 통해 이미 들어가있던 데이터를 처리한다. C#에서의 큐는 내부적으로 순환 배열 구조로 구현 되어 있다.

    실제로 정의를 타고 들어가보면 Queue클래스에 head, tail, size가 존재하는 것을 알 수 있다. 순환 큐는 배열로 구현되는데 tail(후단)이 배열이 빈칸이 있을 때 다시 Head로 가서 Enqueue가 가능하게 계속해서 순환하는 구조를 가지는 것이다.

    https://www.geeksforgeeks.org/introduction-to-circular-queue/

    이런 방식으로 구현이 되어있는것인데 0번 인덱스와 7번 인덱스가 이어져있어 순환하는 배열이 된것이다. Front는 큐에서 Dequeue 그러니깐 데이터가 빠질때 Front는 증가하고 tail은 Enqueue될때 증가한다. 만약 데이터양이 꽉차 큐가 FULL상태가 된다면 Capacity를 2배로 늘려 배열의 크기가 두 배인 배열을 만들고, 전체 복사를 하는 방식으로 큐를 늘린다.


     

    Queue의 사용법

    선언은 간단하다. Stack때와 마찬가지로 Generic을 넣어 선언해주면 된다.

    Queue<int> q = new Queue<int>();

     

    주요 메서드

    • Dequeue() : Queue<T>의 시작 부분의 데이터를 제거하고 반환한다.
    • Enqueue() : Queue<T>의 끝 부분에 데이터를 추가한다.
    • Peek() : Queue<T>의 시작 부분의 데이터를 제거하지않고 반환만 한다.
    static void Main(string[] args)
    {
        Queue<int> q = new Queue<int>();
    
        q.Enqueue(1);
        q.Enqueue(2);
        q.Enqueue(4);
        q.Enqueue(3);
    
        Console.WriteLine(q.Dequeue());
    }

    해당 코드 처럼 작성하게 된다면 {1,2,4,3} 순으로 데이터가 삽입될테도 q.Dequeue()를 진행하면 제일 먼저 들어갔던 {1}데이터가 빠져나오게 된다.

    static void Main(string[] args)
    {
        Queue<int> q = new Queue<int>();
    
        q.Enqueue(1);
        q.Enqueue(2);
        q.Enqueue(4);
        q.Enqueue(3);
    
        Console.WriteLine(q.Dequeue());
        Console.WriteLine(q.Count);
        Console.WriteLine(q.Peek());
        Console.WriteLine(q.Count);
    }
    1. {2,4,3} 상태에서 q.Count를 하면 q의 원소의 갯수 3개가 반환된다.
    2. q.Peek()을해서 제일 앞에있는 원소를 반환만하고 제거를 하지 않는다.
    3. Count()를 해서 제거되지 않았는지 체크한다.


     

     

     

     

     

    'C# > C# 학습정리' 카테고리의 다른 글

    C# - Event  (1) 2024.04.30
    C# - Stack  (0) 2024.04.29
    C# StreamReader ,StreamWriter, 파일 읽기, 쓰기  (0) 2024.04.26
    C# 상속과 다형성  (0) 2024.04.24
    C# Ref 와 Out 키워드  (0) 2024.04.23