우선순위 큐는 일반적인 큐와 달리 데이터의 삽입 순서와 상관없이 우선순위가 높은 데이터가 먼저 나오는 자료구조이다. 각 요소는 우선순위 값을 가지며, 이 값에 따라 큐에서 빠져나오는 순서가 결정된다.
우선순위 큐는 다양한 방법으로 구현할 수 있지만, 가장 효율적인 방법은 이진 힙(Binary Heap)을 사용하는 것이다. 여기서는 C언어를 사용하여 최대 힙(Max Heap) 기반의 우선순위 큐를 구현해보겠다.
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
// 우선순위 큐의 최대 크기 정의
#define MAX_SIZE 100
// 우선순위 큐 구조체 정의
typedef struct {
int heap[MAX_SIZE];
int size;
} PriorityQueue;
// 우선순위 큐 초기화
void initialize(PriorityQueue* pq) {
pq->size = 0;
}
우선순위 큐를 사용하기 전에 초기화하는 함수이다. 큐의 크기를 0으로 설정한다.
// 두 노드 값을 교환하는 함수
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 최대 힙 속성을 유지하기 위해 힙을 재구성하는 함수
void heapifyUp(PriorityQueue* pq, int index) {
int parent = (index - 1) / 2;
if (index > 0 && pq->heap[parent] < pq->heap[index]) {
swap(&pq->heap[parent], &pq->heap[index]);
heapifyUp(pq, parent);
}
}
void heapifyDown(PriorityQueue* pq, int index) {
int largest = index;
int left = 2 * index + 1;
int right = 2 * index + 2;
if (left < pq->size && pq->heap[left] > pq->heap[largest]) {
largest = left;
}
if (right < pq->size && pq->heap[right] > pq->heap[largest]) {
largest = right;
}
if (largest != index) {
swap(&pq->heap[index], &pq->heap[largest]);
heapifyDown(pq, largest);
}
}
heapifyUp은 요소가 삽입된 후 그 요소가 부모 노드보다 우선순위가 높을 경우 위로 이동시키는 함수이다.
heapifyDown은 루트 노드가 제거된 후 마지막 요소가 루트로 이동했을 때, 이를 적절한 위치로 내려보내는 함수이다.