#include <stdio.h>
#define MAX_QUEUE_SIZE 10
// 원형큐 addq(), deleteq()
// 처음 상태
// front
// rear
// ↓
// 0 1 2 3 4
// ┌────┬────┬────┬────┬────┐
// │ │ │ │ │ │
// └────┴────┴────┴────┴────┘
// ① rear가 다음 위치로 이동했을 때 front와 같은가?
// ↓
// YES ───────→ 큐 Full → 삽입하지 않음
// NO
// ↓
// ② rear를 다음 위치로 이동
// ↓
// ③ 그 위치에 item 저장
// front == rear
// → 비어 있음
typedef struct {
int key;
} element;
element queue[MAX_QUEUE_SIZE];
//int front = -1, rear = -1; // 이건 선형큐일때만 가능
int front = 0, rear = 0; //원형큐일때는 front, rear 시작값이 달라야함
void queueFull();
element queueEmpty(void);
void queueFull()
{
printf("QUEUE IS FUll");
}
/* 큐가 비어 있을 때 */
element queueEmpty()
{
element item;
printf("QUEUE IS Empty\n");
item.key = -1;
return item;
}
// 데이터삽입(rear에서만 발생)-> rear 증가 → 증가된 rear 위치에 item 삽입
void addq(element item)
{
rear = (rear+1) % MAX_QUEUE_SIZE;
if(front == rear){ //rear의 바로 다음 칸이 front이면 Full
queueFull();
return; //<--반드시 있어야함. 없으면 다음 명령어가 실행되버림
}
queue[rear] = item; //rear 이동 → 그 위치에 삽입
}
// 데이터삭제(front에서만 발생)
// front 이동 → 그 위치의 데이터 반환 → 논리적으로 삭제
element deleteq()
{
if(front == rear){
return queueEmpty();
}
front = (front+1)%MAX_QUEUE_SIZE;
return queue[front];
}
/* 현재 큐 내용 출력 */
void printQueue()
{
int i;
printf("QUEUE : ");
for (i = front + 1; i <= rear; i++)
{
printf("%d ", queue[i].key);
}
printf("\n");
}
int main() {
element item;
/* 10 삽입 */
item.key = 10;
addq(item);
/* 20 삽입 */
item.key = 20;
addq(item);
/* 30 삽입 */
item.key = 30;
addq(item);
/* 현재 큐 출력 */
printQueue();
/* 데이터 하나 삭제 */
item = deleteq();
printf("삭제된 데이터 : %d\n", item.key);
/* 삭제 후 큐 출력 */
printQueue();
/* 데이터 하나 더 삭제 */
item = deleteq();
printf("삭제된 데이터 : %d\n", item.key);
/* 삭제 후 큐 출력 */
printQueue();
return 0;
}
To embed this project on your website, copy the following code and paste it into your website's HTML: