알고리즘 & 자료구조/코딩테스트
[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
반응형