Priority Queue (최대 힙) (C 언어)

2021. 2. 21. 21:40알고리즘

C++ priority queue 함수 정리 및

C priority queue 구현 예시

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define MAX_PQ_SIZE 100001

typedef struct _Data {
    int xPos;
    int yPos;
    int pri;
} Data;

typedef struct _priority_queue {
    Data mem[MAX_PQ_SIZE];
    int back;
} priority_queue;

void initPQ(priority_queue *pq);
void initData(Data *);
bool empty(priority_queue *pq);
void pop(priority_queue *pq);
void push(priority_queue *pq, Data);
size_t size(priority_queue *pq);
Data top(priority_queue *pq);
void swapData(Data *, Data *);

int main(void)
{
    char inStr[20];
    Data inData;
    priority_queue *pq = (priority_queue *)malloc(sizeof(priority_queue));
    initPQ(pq);
    initData(&inData);

    while (1) {
        printf("Input Command: ");
        scanf("%s", inStr);

        if (!strcmp(inStr, "empty")) {
            if (empty(pq)) { printf("true\n"); }
            else { printf("false\n"); }
        }
        else if (!strcmp(inStr, "pop")) { pop(pq); }
        else if (!strcmp(inStr, "push")) {
            printf("Input Data: ");
            scanf("%d %d %d", &inData.xPos, &inData.yPos, &inData.pri);
            push(pq, inData);
        }
        else if (!strcmp(inStr, "size")) { printf("%d\n", (int)size(pq)); }
        else if (!strcmp(inStr, "top")) {
            inData = top(pq);
            printf("(%d, %d): %d\n", inData.xPos, inData.yPos, inData.pri);
        }
        else if (!strcmp(inStr, "print")) {
            int cur = 1;

            for (int i = 1; i <= (int)size(pq); i++) {
                if (i >= cur * 2) {
                    printf("\n");
                    cur *= 2;
                }
                printf("(%d, %d): %d\t", pq->mem[i].xPos, pq->mem[i].yPos, pq->mem[i].pri);
            }
            printf("\n");
        }
        else if (!strcmp(inStr, "help")) { printf("empty\npop\npush\nsize\ntop\nprint\nhelp\nexit\n"); }
        else if (!strcmp(inStr, "exit")) { break; }
        else { printf("Unknown Command\n"); }
    }

    free(pq);
    return 0;
}

void initPQ(priority_queue *pq)
{
    for (int i = 0; i < MAX_PQ_SIZE; i++)
        initData(&pq->mem[i]);
    pq->back = 0;
}
void initData(Data *data)
{
    data->xPos = 0;
    data->yPos = 0;
    data->pri = 0;
    return;
}
bool empty(priority_queue *pq)
{
    if (!pq->back) { return true; }
    else { return false; }
}
void pop(priority_queue *pq)
{
    if (empty(pq)) { return; }
    pq->mem[1] = pq->mem[pq->back];    //마지막 노드 루트로 이동
    initData(&pq->mem[pq->back--]);    //마지막 노드 pop
    if (empty(pq)) { return; }

    int curSize = (int)size(pq);
    int parent = 1;
    int child = parent * 2;

    while (child <= curSize) {
        if (child + 1 <= curSize && pq->mem[child].pri < pq->mem[child + 1].pri) { child++; }    //두 자식 중 우선순위가 높은 child 선택

        if (pq->mem[parent].pri < pq->mem[child].pri)    {    //자식의 우선순위가 높으면 부모와 변경
            swapData(&pq->mem[parent], &pq->mem[child]);
            parent = child;
            child = parent * 2;
        }
        else { break; }
    }
    return;
}
void push(priority_queue *pq, Data data)
{
    pq->mem[++pq->back] = data;
    if ((int)size(pq) == 1) { return; }

    int child = pq->back;
    int parent = child / 2;

    while (child != 1) {    //부모가 없을 때까지 반복
        if (pq->mem[parent].pri < pq->mem[child].pri) {
            swapData(&pq->mem[parent], &pq->mem[child]);
            child = parent;
            parent = child / 2;
        }
        else { break; }
    }
    return;
}
size_t size(priority_queue *pq) { return (size_t)pq->back; }
Data top(priority_queue *pq) { return pq->mem[1]; }
void swapData(Data *pData, Data *cData)
{
    Data tmpData;
    tmpData = *pData;
    *pData = *cData;
    *cData = tmpData;
    return;
}

'알고리즘' 카테고리의 다른 글

Queue (C 언어)  (0) 2021.02.04
Stack (C 언어)  (0) 2021.01.30