본문 바로가기

DEVELOPMENT/Algorithm

큐(Queue)

반응형

큐 Queue 는 먼저 들어온 데이터가 먼저 나가는 구조를 가진 자료구조다.
즉, 선입선출 FIFO First In First Out 방식으로 작동한다.
이는 마치 줄을 서서 기다리는 사람들의 행렬과 비슷하다.
먼저 줄을 선 사람이 먼저 서비스를 받고 나가는 것과 같은 원리다.


큐의 주요 연산

  1. 인큐 Enqueue
    큐의 뒤 Rear 에 데이터를 추가한다.
  2. 디큐 Dequeue
    큐의 앞 Front 에서 데이터를 꺼내고 제거한다.
  3. 프론트 Front
    큐의 맨 앞에 있는 데이터를 확인하되, 제거하지 않는다.
  4. isEmpty
    큐가 비어 있는지를 확인한다.

큐의 특징

  • 삽입은 뒤쪽에서, 삭제는 앞쪽에서 일어난다.
  • 데이터의 순서가 유지된다.
  • 순차적인 작업 처리나 버퍼 Buffer 구조에 자주 사용된다.
  • 대표적인 예로 프린터 대기열, 프로세스 스케줄링, 네트워크 패킷 처리 등이 있다.

배열을 이용한 큐 구현 예시

#include <iostream>
using namespace std;

#define MAX_SIZE 5  // 큐의 최대 크기

class Queue {
private:
    int data[MAX_SIZE];
    int front;  // 첫 번째 요소의 인덱스
    int rear;   // 마지막 요소의 인덱스

public:
    Queue() {
        front = -1;
        rear = -1;
    }

    bool isEmpty() {
        return front == rear;
    }

    bool isFull() {
        return rear == MAX_SIZE - 1;
    }

    void enqueue(int value) {
        if (isFull()) {
            cout << "큐가 가득 찼다" << endl;
            return;
        }
        data[++rear] = value;
    }

    int dequeue() {
        if (isEmpty()) {
            cout << "큐가 비었다" << endl;
            return -1;
        }
        return data[++front];
    }

    int peek() {
        if (isEmpty()) {
            cout << "큐가 비었다" << endl;
            return -1;
        }
        return data[front + 1];
    }
};

int main() {
    Queue q;
    q.enqueue(10);
    q.enqueue(20);
    q.enqueue(30);

    cout << "맨 앞의 값: " << q.peek() << endl;  // 10 출력

    cout << "디큐: " << q.dequeue() << endl;  // 10 제거
    cout << "디큐: " << q.dequeue() << endl;  // 20 제거

    cout << "현재 맨 앞의 값: " << q.peek() << endl;  // 30 출력

    return 0;
}

정리

큐는 데이터의 순서를 유지하며, 먼저 들어온 데이터를 먼저 처리해야 하는 상황에서 유용하다.
예를 들어, 프린터 출력 순서, 콜센터의 전화 대기, CPU의 작업 처리 등에서 사용된다.
다만 배열 기반 큐는 삭제 시 빈 공간이 생기므로, 이를 보완하기 위해 원형 큐 Circular Queue링 버퍼 Ring Buffer 구조를 사용하기도 한다.

반응형

'DEVELOPMENT > Algorithm' 카테고리의 다른 글

그래프(Graph)  (0) 2019.02.07
정렬(Sorting)의 비교  (0) 2019.02.07
스택(Stack)  (0) 2019.02.07
연결리스트(Linked List)  (0) 2019.02.07
자료구조 개요  (0) 2019.02.07