안녕하세요 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 구현 부분입니다.