원형큐

C/C자료구조 : 2007. 11. 9. 09:50

#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);
}


 *삽입연산


사용자 삽입 이미지


rear의 초기화 값은 0이고

q->rear = (q->rear+1) % MAX_QUEUE_SIZE; 이 줄에 의해서 rear값이 증가한다.

(rear+1)의 값이 MAX_QUEUE_SIZE와 같아지면 나머지가 0이 되면서 front와 값이 같게 된다.

is_full를 불러서 빈공간이 없다는 메시지를 출력한다.

원형큐에서 실제 data나 item의 값은 큐 배열 1번지부터 들어간다.

Posted by 청웨일