ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [baekjoon]C언어 10845번 (큐)
    알고리즘 & 자료구조/코딩테스트 2021. 1. 27. 19:01

    문제

    정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

    명령은 총 여섯 가지이다.

    • push X: 정수 X를 큐에 넣는 연산이다.
    • pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    • size: 큐에 들어있는 정수의 개수를 출력한다.
    • empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
    • front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    • back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

    입력

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

    출력

    출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

    예제 입력 1 복사

    15

    push

    1

    push

    2

    front

    back

    size

    empty

    pop

    pop

    pop

    size

    empty

    pop

    push 3

    empty

    front

    예제 출력 1 복사

    1

    2

    2

    0

    1

    2

    -1

    0

    1

    -1

    0

    3

     

    //1차원 배열을 이용한 큐 구현
    #include <stdio.h>
    #include <string.h>
    
    #define MAX_SIZE 10001
    #define TRUE 1
    #define FALSE 0
    
    typedef int Element;
    
    typedef struct _queue
    {
        Element arr[MAX_SIZE];
        int front; //앞쪽
        int rear; //끝쪽
        int size;
    } Queue;
    
    void init(Queue *q)
    {
        q->front = q->rear = -1;
        q->size = 0;
    }
    
    int isEmpty(Queue *q)
    {
        if(q->front == q->rear){
            return TRUE;
        }
        return FALSE;
    }
    
    int isFull(Queue *q)
    {
        if(q->rear + 1 == MAX_SIZE)
        {
            return TRUE;
        }
        return FALSE;
    }
    
    void enQueue(Queue *q, Element data)
    {
        if(isFull(q) == TRUE)
        {return;}
    
        q->rear = (q->rear + 1);
        q->arr[q->rear] = data;
        q -> size++;
    }
    
    int deQueue(Queue *q)
    {
        if(isEmpty(q) == TRUE)
        {
            return -1;
        }
        
        q->front = (q->front +1); //앞쪽에 있는 항목 삭제되면 front 위치도 이동 시켜준다. 
        q->size--;
        return q->arr[q->front];
    }
    
    int size_print(Queue *q)
    {
        return q->size;
    }
    
    int front(Queue *q)
    {
        if(isEmpty(q) == TRUE)
        {return -1;}
        return q->arr[(q->front)+1];
    }
    
    int back(Queue *q)
    {
        if(isEmpty(q) == TRUE)
        {return -1;}
        return q->arr[q->rear];
    }
    
    int main(void)
    {
        char str[6];
        Queue q;
        int n, num;
    
        scanf("%d", &n);
        init(&q);
    
        for(int i =0; i < n; i++)
        {
            scanf("%s", str);
    
            if(!strcmp(str, "push"))
            {
                scanf("%d", &num);
                enQueue(&q, num);
            }
    
            else if(!strcmp(str, "pop"))
            {
                printf("%d\n", deQueue(&q));
            }
    
            else if(!strcmp(str, "size"))
            {
                printf("%d\n", size_print(&q));
            }
    
            else if(!strcmp(str, "empty"))
            {
                printf("%d\n", isEmpty(&q));
            }
    
            else if(!strcmp(str, "front"))
            {
                printf("%d\n", front(&q));
            }
    
            else if(!strcmp(str, "back"))
            {
                printf("%d\n", back(&q));
            }
        }
    }
    
    //개행문자 때문에 에러 발생했었음,,

     

    728x90
    반응형

    댓글

Designed by Tistory.