[C++] 원형큐(CircularQueue) 만들기
게임 서버 프로그래밍 책을보다가 기초라이브러리 제작목록에 유용한 코드들이 있어서
따라해봤다. 앞으로 책을읽다 흥미가 가는 코드들은 따라해본다음 포스팅할 예정이다...
오늘은 원형큐(CircularQueue)이다. 이 포스팅을 보시는분이라면 원형큐가 어떻게 동작하는지는 알고
있으실꺼라 생각하고 따로 설명은 하지 않겠다.
이 원형큐의 특징은 나머지연산자(%)를 통해서 마지막까지 갔을때 처음으로 돌아온다는 것이다.
사용한 필요준비물은 <windows.h>이다.
CircularQueue는 다음과 같다.
CircularQueue.h
#include <windows.h>
#define MAX_QUEUE_LENGTH 10
template<class T>
class CCircularQueue
{
public:
CCircularQueue(VOID)
{
ZeroMemory(mQueue, sizeof(mQueue));
mQueueHead = mQueueTail = 0;
}
~CCircularQueue(VOID){}
private:
T mQueue[MAX_QUEUE_LENGTH];
DWORD mQueueHead;
DWORD mQueueTail;
public:
BOOL Begin(VOID)
{
ZeroMemory(mQueue,sizeof(mQueue));
mQueueHead = mQueueTail = 0;
return TRUE;
}
BOOL End(VOID)
{
return TRUE;
}
BOOL Push(T data)
{
DWORD TempTail = (mQueueTail + 1) % MAX_QUEUE_LENGTH;
if(TempTail == mQueueHead)
return FALSE;
CopyMemory(&mQueue[TempTail] , &data, sizeof(T));
mQueueTail = TempTail;
return TRUE;
}
BOOL Pop(T& data)
{
if(mQueueHead == mQueueTail)
return FALSE;
DWORD TempHead = (mQueueHead + 1) % MAX_QUEUE_LENGTH;
CopyMemory(&data, &mQueue[TempHead], sizeof(T));
mQueueHead = TempHead;
return TRUE;
}
BOOL IsEmpty(VOID)
{
if( mQueueHead== mQueueTail ) return TRUE;
return false;
}
};
사용예이다.
main.cpp
#include <stdio.h>
#include "CCircularQueue.h"
typedef struct _QUEUE_DATA
{
INT iData1;
BYTE aData2[100];
}QUEUE_DATA;
void PrintQueueData(QUEUE_DATA& data)
{
printf(" iData : %d \n",data.iData1);
printf(" aData2 : %s \n", data.aData2);
}
int main(VOID)
{
CCircularQueue<QUEUE_DATA> queue;
queue.Begin();
BYTE Q1_Data[]="Q1_Data";
BYTE Q2_Data[]="Q2_Data";
QUEUE_DATA pushData;
pushData.iData1 = 10;
ZeroMemory(pushData.aData2, sizeof(pushData.aData2));
CopyMemory(pushData.aData2, Q1_Data, sizeof(Q1_Data));
QUEUE_DATA pushData2;
pushData2.iData1 = 20;
ZeroMemory(pushData2.aData2, sizeof(pushData2.aData2));
CopyMemory(pushData2.aData2, Q2_Data, sizeof(Q2_Data));
printf("----- PUSH ----- \n");
PrintQueueData(pushData);
queue.Push(pushData);
PrintQueueData(pushData2);
queue.Push(pushData2);
QUEUE_DATA popData;
QUEUE_DATA popData2;
queue.Pop(popData);
queue.Pop(popData2);
printf("----- POP ----- \n");
PrintQueueData(popData);
PrintQueueData(popData2);
return 0;
}
결과 화면이다.
누군가에게는 작은도움이 되었기를 바라면서 오늘의 포스팅 끝~