[백준] 18258번 큐2 (= queue2) - 재우스 프로그래밍 (C 언어)

2021. 2. 20. 17:18백준

문제 링크 :www.acmicpc.net/problem/18258

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

#define DEBUG 1
#define MAX_QUEUE_SIZE 2000001

typedef struct _queue {
    int mem[MAX_QUEUE_SIZE];
    int front;
    int back;
} queue;
queue *qu;

bool empty(queue *);
void pop(queue *);
void push(queue *, int);
size_t size(queue *);
int front(queue *);
int back(queue *);
void initQueue(queue *);

int main(void)
{
    int N = 0;    //명령어의 개수
    int tmp = 0;
    char inStr[6];

    scanf("%d", &N);
    qu = (queue *)malloc(sizeof(queue));
    initQueue(qu);

    for (int i = 0; i < N; i++) {
        scanf("%s", inStr);
        if (!strcmp(inStr, "empty")) {
            if (empty(qu))
                printf("1\n");
            else
                printf("0\n");
        }
        else if (!strcmp(inStr, "pop")) {
            if (empty(qu))
                printf("-1\n");
            else {
                tmp = front(qu);
                pop(qu);
                printf("%d\n", tmp);
            }
        }
        else if (!strcmp(inStr, "push")) {
            scanf("%d", &tmp);
            push(qu, tmp);
        }
        else if (!strcmp(inStr, "size")) {
            printf("%d\n", (int)size(qu));
        }
        else if (!strcmp(inStr, "front")) {
            if (empty(qu))
                printf("-1\n");
            else
                printf("%d\n", front(qu));
        }
        else if (!strcmp(inStr, "back")) {
            if (empty(qu))
                printf("-1\n");
            else
                printf("%d\n", back(qu));
        }
        else
            printf("unknown order\n");
    }

    free(qu);
    return 0;
}

bool empty(queue *qu)
{
    if (qu->front == qu->back) { return true; }
    else { return false; }
}
void pop(queue *qu)
{
    qu->front++;
    qu->mem[qu->front] = 0;
    return;
}
void push(queue *qu, int data)
{
    qu->back++;
    qu->mem[qu->back] = data;
    return;
}
size_t size(queue *qu) { return (size_t)(qu->back - qu->front); }
int front(queue *qu) { return qu->mem[qu->front + 1]; }
int back(queue *qu) { return qu->mem[qu->back]; }
void initQueue(queue *qu)
{
    for (int i = 0; i < MAX_QUEUE_SIZE; i++)
        qu->mem[i] = 0;
    qu->front = -1;
    qu->back = -1;
    return;
}