본문 바로가기

TEST/자료구조와 함께 배우는 알고리즘 입문(C언어)

<4> Q6. 자료구조와 함께 배우는 알고리즘 입문 (C언어)

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

typedef struct
{
    int max;
    int num;
    int front;
    int rear;
    int *que;
} IntQueue;

int Initialize(IntQueue *q, int max)
{
    q->num = 0, q->front = max / 2, q->rear = max / 2 + 1;
    if ((q->que = (int *)calloc(max, sizeof(int))) == NULL)
    {
        q->max = 0;
        return -1;
    }
    q->max = max;
    return 0;
}

int EnQueue_L(IntQueue *q, int x)
{
    if (q->front < 0)
    {
        return -1;
    }
    else
    {
        q->que[q->front--] = x;
        q->num++;
        return 0;
    }
}

int EnQueue_R(IntQueue *q, int x)
{
    if (q->rear < q->max / 2 + 1)
    {
        return -1;
    }
    else
    {
        q->que[q->rear++] = x;
        q->num++;
        return 0;
    }
}

int DeQueue_L(IntQueue *q, int *x)
{
    if (q->front >= q->max / 2)
    {
        return -1;
    }
    else
    {
        *x = q->que[++q->front];
        q->num--;
        return 0;
    }
}

int DeQueue_R(IntQueue *q, int *x)
{
    if (q->rear <= q->max / 2 + 1)
    {
        return -1;
    }
    else
    {
        *x = q->que[--q->rear];
        q->num--;
        return 0;
    }
}

int Capacity(const IntQueue *q)
{
    return q->max;
}

int Size(const IntQueue *q)
{
    return q->num;
}

void Print(const IntQueue *q)
{
    for (int i = 0; i < q->num; i++)
    {
        printf("%d ", q->que[i + q->front + 1]);
    }
    printf("\n");
}
int main(void)
{
    IntQueue que;
    if (Initialize(&que, 64) == -1)
    {
        puts("큐의 생성에 실패하였습니다.");
        return 1;
    }
    while (1)
    {
        int m, x, y;
        printf("현재 데이터 수 : %d / %d \n", Size(&que), Capacity(&que));
        printf("(1)인큐L (2)인큐R (3)디큐L (4)디큐R (5)출력 (0)종료 : ");
        scanf("%d", &m);

        if (m == 0)
            break;
        switch (m)
        {
        case 1:
            printf("데이터 : ");
            scanf("%d", &x);
            if (EnQueue_L(&que, x) == -1)
                puts("\a오류 : 인큐에 실패하였습니다.");
            break;

        case 2:
            printf("데이터 : ");
            scanf("%d", &x);
            if (EnQueue_R(&que, x) == -1)
                puts("\a오류 : 인큐에 실패하였습니다.");
            break;
        case 3:
            if (DeQueue_L(&que, &x) == -1)
                puts("\a오류 : 디큐에 실패하였습니다.");
            else
            {
                printf("디큐한 데이터는 %d입니다.\n", x);
            }
            break;

        case 4:
            if (DeQueue_R(&que, &x) == -1)
                puts("\a오류 : 디큐에 실패하였습니다.");
            else
            {
                printf("디큐한 데이터는 %d입니다.\n", x);
            }
            break;
        case 5:
            if (que.num <= 0)
            {
                printf("FAIL\n");
            }
            else
            {
                Print(&que);
                break;
            }
        }
    }
}