카테고리 없음

[자료구조] 큐(Queue) - 배열을 이용한 구현

gksdydrkfl의 공부방! 2023. 7. 28. 17:39

큐(Queue)

 

큐 란?

  • 가장 먼저 들어간 데이터가 제일 먼저 나온다 (First In - First Out) FIFO
  • 나중에 집어 넣은 데이터가 먼저 나오는 스택과는 반대되는 개념이다.

큐의 주요 기능

  • DeQueue : 큐의 맨 앞에 있는 데이터를 제거 후 반환
  • EnQueue : 큐의 제일 뒤에 새로운 데이터 추가
  • Peek  : 큐의 맨 앞에 있는 데이터를 반환

배열 형 큐 클래스

class MyQueue
{
public:
    MyQueue();

private:

    int Front;
    int Rear;
    int Capacity;
    int* Data;

public:

    void CreateQueue(const int& Size);
    bool IsEmpty();
    bool IsFull();
    int DeQueue();
    void EnQueue(const int& NewData);
    int Peek();
    void Show();
};

배열 형 큐 생성

외부로 부터 크기를 받고 크기만큼 동적할 당 후 Capacity를 통해 사이즈를 기억해준다.

void MyQueue::CreateQueue(const int& Size)
{
    Data = new int[Size];
    Capacity = Size;
}

 

배열 형 큐 체크 함수

비어있는지 확인하는 함수와 꽉차있는지 확인해주는 함수이다.

이때 Rear를 통해 Rear가 0보다 작으면 비어있고 0이상이면 1개의 이상의 데이터가 존재한다. 

bool MyQueue::IsEmpty()
{
    return Rear < 0 ? true : false;
}

Rear와 Capacity - 1 와 같으면 꽉차있고 아니면 꽉차 있지않다.

bool MyQueue::IsFull()
{
    return Rear == Capacity - 1 ? true : false;
}

 

배열 형 큐 DeQueue

먼저 큐의 데이터가 있는지 확인 후

현재 Front의 값을 가져오고 Front를 증감시켜준다.

그런 다음 Dequeue를 하게 되면 증감된 Front로 인하여 다음 데이터를 가르키게 된다.

int MyQueue::DeQueue()
{
    if (IsEmpty())
    {
        return -1;
    }
    return Data[Front++];
}

배열 형 큐 EnQueue

먼저 큐가 꽉차있는지 확인 후 꽉차 있지 않으면

Rear를 먼저 증감연산자를 통해 증감시키고 배열에 접근하여 데이터를 넣어준다.

처음 Rear의 값은 -1로 시작해준다.

void MyQueue::EnQueue(const int& NewData)
{
    if (!IsFull())
    {
        Data[++Rear] = NewData;
    }
}

배열 형 큐 Peek

 

DeQueue는 데이터를 반환함과 동시에 반환한 다음 순서의 데이터가 1순위가 된다.

Peek는 단순히 제일 첫번째의 값을 반환해준다.

먼저 비어있는지 체크 후 비어있으면 -1의 값을 반환해주고 아니라면 데이터의 Front를 통해 접근하여 단순히 첫번째 데이터를

반환해준다. 

int MyQueue::Peek()
{
    return IsEmpty() ? -1 : Data[Front];
}

 

배열 형 큐 메인 함수

int main()
{
    MyQueue* Queue = new MyQueue();

    Queue->CreateQueue(5);
    Queue->EnQueue(1);
    Queue->EnQueue(2);
    Queue->EnQueue(3);
    Queue->EnQueue(4);
    Queue->EnQueue(5);
    int a = Queue->Peek();
    std::cout << a << std::endl;
    Queue->DeQueue();
    Queue->Show();
}

Queue를 동적할당 해주고 CreateQueue를 통해 5개의 배열을 만들어 준다.

EnQueue를 통해 1,2,3,4,5를 넣어주며  Peek를 통해 데이터를 꺼내오고 출력하면 1이 출력되며

Dequeue를 통해 첫번째를 삭제하고 Show를 통해 출력을 하면 2,3,4,5가 출력됨을 볼 수 있다.

 

배열 형 큐 장단점

장점

  • 데이터의 삽입 삭제가 쉽고 빠르다.
  • 선형이기에 입력순서를 처리할때 유용하다.

단점

  • 선형이기에 데이터를 추가를 하다보면 한계가 생기게 된다
  • 삭제를 하게되면 삭제된 위치의 메모리는 남아있고 쓸모없게된다

       - 배열 큐의 단점을 보완하기 위해 원형 큐가 존재한다.