#include <stdio.h>
#define MAX_QUEUE_SIZE 100
typedef int element;
typedef struct {
element queue[MAX_QUEUE_SIZE];
int front, rear;
}QueueType;
void error(char *message)
{
fprintf(stderr, "%s\n", message);
}
void init(QueueType *q)
{
q->front = q->rear = 0;
}
int is_empty(QueueType *q)
{
return (q->front == q->rear);
}
int is_full(QueueType *q)
{
return ((q->rear+1)%MAX_QUEUE_SIZE == q->front);
}
//q->rear의 값은 0을 초기화된 상태 그대로 +1된것이 대입되지 않았기 때문에 여전히 0이다.
//1을 MAX로 나눈 나머지는 1이다.
//MAX로 나누는 것은 전체 저장공간에 대한 대비로 쓰인 알고리즘이다.
//(q->rear+1)을 MAX로 나눈 나머지가 0이 되면 =>> { (q->rear+1) == MAX }
//q->front와 값이 같게 되어서 1(참값)을 리턴한다.
void enqueue(QueueType *q, element item)
{
if(is_full(q)) error("큐가 포화상태입니다."); //여기가 리턴 받는곳, 조건이 참이 되면 에러메시지를 출력
q->rear = (q->rear+1) % MAX_QUEUE_SIZE; //q->rear값을 증가시키는 부분
q->queue[q->rear] = item; //실제 데이터는 배열의 1번지부터 들어간다.
} //0번지에는 q->front가 위치한다.
element dequeue(QueueType *q)
{
if(is_empty(q)) error("큐가 공백상태입니다."); //공백상태 검출
q->front = (q->front+1) % MAX_QUEUE_SIZE; //front를 queue배열에서 한칸 움직인다.
return q->queue[q->front]; //front의 값을 배열로 하는 queue의 값을 반환한다.
}
//실제 값의 삭제는 이루어지지 않는다.
//front를 움직임으로서 그 저장공간을 다른 값으로 덮어씌울수 있는 공간으로 만든다.
//만일 삽입함수로 rear가 queue[0]의 위치에 와도
// !(q->front == q->rear)이기 때문에 포화상태가 아니다.
element peek(QueueType *q)
{
if(is_empty(q)) error("큐가 공백상태입니다.");
return q->queue[(q->front+1) % MAX_QUEUE_SIZE];
}
void main()
{
QueueType q;
init(&q);
printf("front = %d, rear = %d\n", q.front, q.rear);
enqueue(&q, 1);
enqueue(&q, 2);
enqueue(&q, 3);
printf("dequeue() = %d\n", dequeue(&q));
printf("dequeue() = %d\n", dequeue(&q));
printf("dequeue() = %d\n", dequeue(&q));
printf("front = %d, rear = %d\n", q.front, q.rear);
}
*삽입연산
![사용자 삽입 이미지](https://t1.daumcdn.net/tistoryfile/fs2/12_2_6_10_blog113315_attach_0_0.jpg?original)
rear의 초기화 값은 0이고
q->rear = (q->rear+1) % MAX_QUEUE_SIZE; 이 줄에 의해서 rear값이 증가한다.
(rear+1)의 값이 MAX_QUEUE_SIZE와 같아지면 나머지가 0이 되면서 front와 값이 같게 된다.
is_full를 불러서 빈공간이 없다는 메시지를 출력한다.
원형큐에서 실제 data나 item의 값은 큐 배열 1번지부터 들어간다.