// 백준 solved
// 원형큐 (배열)
// front는 항상 공백. front 한 칸 뒤부터 시작
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10001 // size는 define으로 하거나 주어지면 동적할당으로 하거나(옵션)
typedef int QData;
typedef struct _CircularQueue {
QData* arr;
int size;
int front; // front에는 데이터 없음. 원형큐는 front 한 칸만 공백
int rear;
}CQueue;
void CQInit(CQueue* qp,int size) {
qp->arr = (QData*)malloc(sizeof(QData) * size);
qp->size = size;
qp->front = qp->rear = 0;
}
int NextPosIdx(CQueue* qp,int pos) {
return (pos + 1) % qp->size;
}
int CQIsEmpty(CQueue* qp) {
return qp->front == qp->rear ? 1 : 0;
}
int CQIsFull(CQueue* qp) {
return NextPosIdx(qp,qp->rear) == qp->front ? 1:0;
}
void CQPush(CQueue* qp, QData data) {
if (!CQIsFull(qp)) {
qp->rear = NextPosIdx(qp, qp->rear); // rear 한칸 이동 후 저장
qp->arr[qp->rear] = data;
}
}
void CQPop(CQueue* qp) {
if (!CQIsEmpty(qp)) {
qp->front = NextPosIdx(qp,qp->front); // front 한칸 이동 후 출력
printf("%d\n", qp->arr[qp->front]);
}
else {
printf("-1\n");
}
}
QData CQFront(CQueue* qp) {
if (!CQIsEmpty(qp)) return qp->arr[NextPosIdx(qp,qp->front)];
else return -1;
}
QData CQBack(CQueue* qp) {
if (!CQIsEmpty(qp)) return qp->arr[qp->rear];
else return -1;
}
int CQSize(CQueue* qp) {
return qp->rear >= qp->front ? qp->rear - qp->front : (qp->size - qp->front) + qp->rear;
}