[Data Structure] C스타일의 원형큐 구현

원형 큐의 Enqueue와 Dequeue 구현

#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 5

typedef struct {
	int data[MAX_SIZE];
	int rear;
	int front;
} CircularQueue;

void initQueue(CircularQueue* q) {
	q->rear = 0;
	q->front = 0;
}

// 같다면 empty
int isEmpty(CircularQueue* q) {
	return q->front == q->rear;
}

// 한칸 차이일때 full
// 사실상 모든 큐를 채우는 것이 아니다. 한칸을 남겨둬야 empty와 구분이 가능
int isFull(CircularQueue* q) {
	return (q->rear + 1) % MAX_SIZE == q->front;
}

void enqueue(CircularQueue* q, int val) {
	if (isFull(q)) {
		printf("isfull\n");
		return;
	}
	q->rear = (q->rear + 1) % MAX_SIZE;
	q->data[q->rear] = val;
}

int dequeue(CircularQueue* q) {
	if (isEmpty(q)) {
		printf("isEmpty\n");
		return -1;
	}
	q->front = (q->front + 1) % MAX_SIZE;
	return q->data[q->front];
}

void display(CircularQueue* q) {
	printf("Queue: ");
	int i = (q->front + 1) % MAX_SIZE;
	while (i != (q->rear + 1) % MAX_SIZE) {
		printf("%d ", q->data[i]);
		i = (i + 1) % MAX_SIZE;
	}
	printf("\n");
}

int main() {
	CircularQueue q;
	initQueue(&q);

	enqueue(&q, 10);
	enqueue(&q, 20);
	enqueue(&q, 30);
	enqueue(&q, 40);
	display(&q);

	dequeue(&q);
	display(&q);

	enqueue(&q, 50);
	display(&q);

	enqueue(&q, 60); // 큐가 가득 찼을 때 시도
	display(&q);

	return 0;
}