10845,18528: 큐 1, 큐 2

서희찬·2021년 9월 16일
0

백준

목록 보기
34/105

10845

문제

코드


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

#define TRUE 1
#define FALSE 0

#define QUE_LEN 10001
typedef int Data;

typedef struct _cQueue
{
    int front;
    int rear;
    Data queArr[QUE_LEN];
}Queue;

void QueueInit(Queue * pq)
{
    pq->front = 0;
    pq->rear = 0;
}

int QIsEmpty(Queue * pq)
{
    if(pq->front == pq->rear)
        return TRUE;
    else
        return FALSE;
}

int front(Queue *pq)
{
    if(QIsEmpty(pq))
    {
        return -1;
    }
    return pq->queArr[pq->front+1];
}

int back(Queue *pq)
{
    if(QIsEmpty(pq))
    {
        return -1;
    }
    return pq->queArr[pq->rear];
}


void Enqueue(Queue * pq, Data data)
{
    pq->rear = (pq->rear + 1) % QUE_LEN;
    pq->queArr[pq->rear] = data;
}

Data Dequeue(Queue * pq)
{
    if(QIsEmpty(pq))
    {
        return -1;
    }

    pq->front = (pq->front+1)%QUE_LEN;
    return pq->queArr[pq->front];
}

int size(Queue *pq)
{
        return pq->rear - pq->front;
}

int main(void)
{
    Queue q;
    char str[6];
    int newNum;
    QueueInit(&q);

    int num;
    scanf("%d",&num);
        for(int i=0;i<num;i++)
        {
            scanf("%s",str);
            if(!strcmp(str, "push"))//같으면 0출력
            {
                scanf("%d",&newNum);
                Enqueue(&q, newNum);
            }
            else if(!strcmp(str, "pop"))
            {
                printf("%d\n",Dequeue(&q));
            }
            else if(!strcmp(str, "size"))
            {
                printf("%d\n",size(&q));
            }
            else if(!strcmp(str, "empty"))
            {
                printf("%d\n",QIsEmpty(&q));
            }
            else if(!strcmp(str, "front"))
            {
                printf("%d\n",front(&q));
            }
            else if(!strcmp(str, "back"))
            {
                printf("%d\n",back(&q));
            }
        }
    return 0;
}

해설

큐에 관한 문제이다 문자열을 받는 방식은 앞서 푼 스택과 동일시하게 진행하면된다.
그리고 큐의 엔큐와 디큐에 나머지 연산자를 사용하는것은 원형큐를 활용하기 위한 것이다.

18528

문제

코드


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

#define TRUE 1
#define FALSE 0

#define QUE_LEN 2000001
typedef int Data;

typedef struct _cQueue
{
    int front;
    int rear;
    Data queArr[QUE_LEN];
}Queue;

void QueueInit(Queue * pq)
{
    pq->front = 0;
    pq->rear = 0;
}

int QIsEmpty(Queue * pq)
{
    if(pq->front == pq->rear)
        return TRUE;
    else
        return FALSE;
}

int front(Queue *pq)
{
    if(QIsEmpty(pq))
    {
        return -1;
    }
    return pq->queArr[pq->front+1];
}

int back(Queue *pq)
{
    if(QIsEmpty(pq))
    {
        return -1;
    }
    return pq->queArr[pq->rear];
}


void Enqueue(Queue * pq, Data data)
{
    pq->rear = (pq->rear + 1) % QUE_LEN;
    pq->queArr[pq->rear] = data;
}

Data Dequeue(Queue * pq)
{
    if(QIsEmpty(pq))
    {
        return -1;
    }

    pq->front = (pq->front+1)%QUE_LEN;
    return pq->queArr[pq->front];
}

int size(Queue *pq)
{
        return pq->rear - pq->front;
}

int main(void)
{
    Queue q;
    char str[6];
    int newNum;
    QueueInit(&q);

    int num;
    scanf("%d",&num);
        for(int i=0;i<num;i++)
        {
            scanf("%s",str);
            if(!strcmp(str, "push"))//같으면 0출력
            {
                scanf("%d",&newNum);
                Enqueue(&q, newNum);
            }
            else if(!strcmp(str, "pop"))
            {
                printf("%d\n",Dequeue(&q));
            }
            else if(!strcmp(str, "size"))
            {
                printf("%d\n",size(&q));
            }
            else if(!strcmp(str, "empty"))
            {
                printf("%d\n",QIsEmpty(&q));
            }
            else if(!strcmp(str, "front"))
            {
                printf("%d\n",front(&q));
            }
            else if(!strcmp(str, "back"))
            {
                printf("%d\n",back(&q));
            }
        }
    return 0;
}

해설

그냥 위의 큐에서 범위만 바꿔주니 맞았당...
뭘 정확히 체크해야할지는 나중에 .. ! 하겠다 헿..
아 몰ㄹ랑 !

profile
부족한 실력을 엉덩이 힘으로 채워나가는 개발자 서희찬입니다 :)

0개의 댓글