[c언어] 큐의 종류

C언어에서 큐는 메모리 내부에서 데이터를 순서대로 저장하고 삭제하는 자료 구조입니다. 큐는 여러 종류가 있지만 대표적인 두 가지 종류를 다루어 보겠습니다.

1. 배열 기반 큐 (Array-based Queue)

배열 기반 큐는 배열을 사용하여 데이터를 저장하는 큐입니다. 크기가 정해져 있기 때문에 고정된 개수의 데이터를 저장하고 삭제할 수 있습니다. 데이터를 삽입하거나 삭제할 때 배열의 크기를 변경하는 것은 불가능하기 때문에, 크기에 대해 미리 알고 있어야 합니다.

#define MAX_SIZE 100
int queue[MAX_SIZE];
int front = -1, rear = -1;

void enqueue(int data) {
    if (rear == MAX_SIZE - 1) {
        printf("Queue is full");
    } else {
        if (front == -1) {
            front = 0;
        }
        rear++;
        queue[rear] = data;
    }
}

int dequeue() {
    int data;
    if (front == -1 || front > rear) {
        printf("Queue is empty");
        return -1;
    } else {
        data = queue[front];
        front++;
        return data;
    }
}

2. 연결 리스트 기반 큐 (Linked List-based Queue)

연결 리스트 기반 큐는 연결 리스트를 사용하여 데이터를 저장하는 큐입니다. 크기가 동적으로 변경될 수 있기 때문에, 데이터를 삽입하거나 삭제할 때마다 메모리를 동적으로 할당 또는 해제할 수 있습니다. 이는 배열 기반 큐와 달리 큐의 크기에 대해 미리 알 필요가 없다는 장점이 있습니다.

struct Node {
    int data;
    struct Node* next;
};

struct Node* front = NULL;
struct Node* rear = NULL;

void enqueue(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    if (front == NULL && rear == NULL) {
        front = rear = newNode;
    } else {
        rear->next = newNode;
        rear = newNode;
    }
}

int dequeue() {
    int data;
    if (front == NULL) {
        printf("Queue is empty");
        return -1;
    } else {
        struct Node* temp = front;
        data = temp->data;
        if (front == rear) {
            front = rear = NULL;
        } else {
            front = front->next;
        }
        free(temp);
        return data;
    }
}

위에서 설명한 두 종류의 큐는 각각 배열 기반 큐와 연결 리스트 기반 큐로, 데이터를 저장하고 삭제하는 방식에서의 차이가 있습니다. 적절한 상황에 맞게 선택하여 사용할 수 있도록 이해하는 것이 중요합니다.

참고 자료