티스토리 뷰

C & C++

[C++] 원형큐(CircularQueue) 만들기

강씨아저씨 2016. 2. 1. 21:27

게임 서버 프로그래밍 책을보다가 기초라이브러리 제작목록에 유용한 코드들이 있어서

따라해봤다. 앞으로 책을읽다 흥미가 가는 코드들은 따라해본다음 포스팅할 예정이다...

오늘은 원형큐(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;

}


결과 화면이다. 


 

누군가에게는 작은도움이 되었기를 바라면서 오늘의 포스팅 끝~



댓글