这只是一段简单的实现代码,并不完善且未经严格测试,只作为学习参考。
#define MAX_QUEUE_LENGTH 100
template <class T>
class CCircularQueue
{
public:
CCircularQueue(VOID)
{
ZeroMemory(mQueue,sizeof(mQueue));
mQueueHead = mQueueTail = 0;
}
~CCircularQueue(VOID) {}
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(mQueueTail == mQueueHead)
return FALSE;
DWORD TempHead = (mQueueHead + 1) % MAX_QUEUE_LENGTH;
CopyMemory(&data,&mQueue[TempHead],sizeof(T));
mQueueHead = TempHead;
return TRUE;
}
BOOL IsEmpty(VOID)
{
if(mQueueTail == mQueueHead)
return TRUE;
return FALSE;
}
private:
T mQueue[MAX_QUEUE_LENGTH];
DWORD mQueueHead;
DWORD mQueueTail;
};
测试代码:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
typedef struct _QUEUE_DATA
{
INT iData1;
BYTE aData2[100];
} QUEUE_DATA;
int _tmain(int argc,_TCHAR* argv[])
{
CCircularQueue<QUEUE_DATA> Queue;
Queue.Begin();
QUEUE_DATA PushData;
PushData.iData1 = 10;
ZeroMemory(PushData.aData2,sizeof(PushData.aData2));
Queue.Push(PushData);
QUEUE_DATA PopData;
Queue.Pop(PopData);
system("pause");
return 0;
}