STUDY/Algorithm

[백준] 18258 큐2 C

sinawi95 2021. 11. 29. 17:31
728x90

https://www.acmicpc.net/problem/18258

 

18258번: 큐 2

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
# define FAIL 99999999

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

typedef struct _Queue {
    Node* front;
    Node* rear;
    int size;
} Queue;

void initialize(Queue* q) {
    q->front = q->rear = NULL;
    q->size = 0;
};

int isEmpty(Queue* q) {
    return (q->size == 0);
};

void enQ(int data, Queue* q) {
    // Create a node
    //Node* new_node;
    Node* new_node = malloc(sizeof(Node));
    new_node->data = data;
    new_node->next = NULL;

    // link
    if (isEmpty(q)) {
        q->front = new_node;
        q->rear = new_node;
    }
    else {
        q->rear->next = new_node;
        q->rear = q->rear->next;
    }
    q->size++;
};
int deQ(Queue* q) {
    int ret = FAIL;
    if (!isEmpty(q)) {
        ret = q->front->data;
        q->front = q->front->next;
        q->size--;
    }
    return ret;
};

int main()
{
    int N, i, num, tmp;
    char input[6];

    Queue q;
    initialize(&q);

    scanf("%d", &N);
    for (i = 0; i < N; i++)
    {
        scanf("%s", input);
        
        if (input[0] == 'p') {
            if (input[1] == 'u') { // push
                scanf("%d", &num);
                enQ(num, &q);
            }
            else { // pop
                tmp = deQ(&q);
                if (tmp == FAIL) {
                    printf("-1\n");
                } else {
                    printf("%d\n", tmp);
                }
            }
        } else if (input[0] == 's') { // size
            printf("%d\n", q.size);
        } else if (input[0] == 'e') {
            printf("%d\n", isEmpty(&q));
        } else if (input[0] == 'f') {
            if (q.size) {
                printf("%d\n", q.front->data);
            } else {
                printf("-1\n");
            }
        } else if (input[0] == 'b') {
            if (q.size) {
                printf("%d\n", q.rear->data);
            }
            else {
                printf("-1\n");
            }

        }
    }


    return 0;
}

오랜만에 C 로 풀었다.

linked list, queue를 다시 상기시키기 위해 시작했는데 포인터나 string 관련 때문에 꽤 오래걸렸다.