본문 바로가기

[C언어]

[c언어] FIFO(First in First Out) circular Queue(원형큐)구현

안녕하세요 Docker입니다.

Stack 다음인 Queue를 구현해보도록 하겠습니다.

 

 

#ifndef __C_QUEUE_H__


#define __C_QUEUE_H__

#define TRUE 1
#define FALSE 0

#define Que_Len 100

typedef int Data;


typedef struct __cQueue {
	int front;
	int rear;
	Data QueueArr[Que_Len];

}CQueue;

typedef CQueue Queue;

void QueueInit(Queue * pq);
int QIsEmpty(Queue* pq);

void Enqueue(Queue * pq, Data data);
Data Dequeue(Queue * pq);
Data QPeek(Queue * pq);



#endif // !__C_QUEUE_H__

우선 헤더파일입니다.

헤더 파일은 __C_QUEUE_H__로 정의하였습니다.

 

#include<stdio.h>
#include<stdlib.h>
#include "CircularQueue.h"

void QueueInit(Queue * pq) {//queue를 초기화 시킨다
	pq->front = 0;
	pq->rear = 0;

}


int QIsEmpty(Queue* pq) {//q가 비었는지 확인
	if (pq->front == pq->rear)//만약 비었다면 TRUE를 반환
		return TRUE;
	else
		return FALSE;
}

int NextPosIdx(int pos) {//q가 끝에 도달했는지 확인
	if (pos == Que_Len - 1)
		return 0;

	else
		return pos + 1;

}

void Enqueue(Queue * pq, Data data) {//q에 데이터 삽입
	if (NextPosIdx(pq->rear) == pq->front) {
		printf("Queue Memory ERROR");
		exit(-1);
	}

	pq->rear = NextPosIdx(pq->rear);
	pq->QueueArr[pq->rear] = data;

}


Data Dequeue(Queue * pq) {//q에서 데이터 출력
	if (QIsEmpty(pq)) {
		printf("Queue Memory ERROR");
		exit(-1);
	}
	pq->front = NextPosIdx(pq->front);
	return pq->QueueArr[pq->front];

}



Data QPeek(Queue * pq) {//q에서 데이터를 삭제하지않고 값 출력
	if (QIsEmpty(pq)) {
		printf("Queue Memory ERROR");
		exit(-1);
	}
	return pq->QueueArr[NextPosIdx(pq->front)];
}


int QueueCall() {//연습용이다보니 이런식으로 c파일을 재사용하기위해 Call함수를 구현하였습니다.
	Queue q;
	QueueInit(&q);

	for (int i = 1; i < 6; i++) {
		Enqueue(&q, i);
	}
	
	while (!QIsEmpty(&q))
		printf("%d", Dequeue(&q));
	

	return 0;

}

int main() {

	QueueCall();

	return 0;
}

다음으로 Queue 구현 부분입니다.