CH.개인기록 노트

C#은 처음이라

C# 자료구조 (큐Queue)

amckdgjs 2024. 3. 12. 17:21

큐(Queue)는 선입선출(First in First Out)구조로 먼저 추가된 요소가 먼저 제거되는 데이터 구조이다.

그림판으로 그림.

그림처럼 들어왔다가 들어온 순서대로 나가는 구조임.

큐의 멤버 함수

  • Enqueue : 요소를 큐의 맨 뒤에 추가한다.
  • Dequeue : 큐의 맨 앞에 있는 요소를 제거하고 반환한다.

장점:

  • 들어온 순서를 유지하기 때문에 순서에 따라 처리하는 작업에 유용하다.(ex.롤 대기열)
  • 큐는 크기가 제한되지 않기 때문에 동적으로 크기가 조정 가능하다.

단점:

  • 큐가 커질수록 요소를 추가하거나 제거하는 데에 시간이 걸릴 수 있다.
using System;

namespace QueueImplementation
{
    public class Queue<T>
    {
        private const int MAX_SIZE = 3; // 큐의 최대 크기
        private T[] values; // 큐의 요소를 저장하는 배열
        private int head; // 큐의 맨 앞을 가리키는 인덱스
        private int tail; // 큐의 맨 뒤를 가리키는 인덱스

        // 큐 클래스의 생성자
        public Queue()
        {
            values = new T[MAX_SIZE]; // 배열 초기화
            head = 0; // 큐의 맨 앞 초기화
            tail = -1; // 큐의 맨 뒤 초기화
        }

        // 큐가 비어 있는지 여부를 확인하는 메서드
        public bool IsEmpty()
        {
            return head > tail; // head가 tail보다 크면 큐가 비어 있음
        }

        // 큐가 가득 찼는지 여부를 확인하는 메서드
        public bool IsFull() 
        {
            return tail == MAX_SIZE - 1; // tail이 배열의 최대 인덱스와 같으면 큐가 가득 참
        }

        // 큐에 요소를 추가하는 메서드
        public void Enqueue(T val)
        {
            if (IsFull())
            {
                Console.WriteLine("오버플로우."); // 큐가 가득 찬 경우 오버플로우 메시지 출력
                return;
            }

            tail++; // tail을 한 칸 뒤로 이동
            values[tail] = val; // tail 위치에 요소 추가
        }

        // 큐에서 요소를 제거하고 반환하는 메서드
        public T Dequeue()
        {
            if (IsEmpty())
            {
                Console.WriteLine("언더플로우"); // 큐가 비어 있는 경우 언더플로우 메시지 출력
                return default(T); // 기본값 반환
            }

            T val = values[head]; // head 위치의 요소를 val에 저장
            head++; // head를 한 칸 앞으로 이동
            return val; // 제거된 요소 반환
        }
    }

    internal class Program
    {
        private static void Main()
        {
            Queue<int> myQueue = new Queue<int>(); // 정수형 큐 생성

            myQueue.Enqueue(10); // 큐에 요소 추가
            myQueue.Enqueue(20);
            myQueue.Enqueue(30);
            
            // 큐에서 요소를 제거하고 출력
            Console.WriteLine(myQueue.Dequeue()); // 10
            Console.WriteLine(myQueue.Dequeue()); // 20
            Console.WriteLine(myQueue.Dequeue()); // 30
        }
    }
}

'C#은 처음이라' 카테고리의 다른 글

C# 트리,이진탐색트리(bst)  (0) 2024.03.14
C# 리스트(List)  (0) 2024.03.13
C# 자료구조(스택)  (0) 2024.03.12
C# 이벤트(Event)와 델리게이트(Delegate)  (0) 2024.03.11
C# 일반화(Generic)  (1) 2024.03.08