您的位置:首页 > 其它

循环数组实现队列

2016-02-25 17:05 495 查看
固定SIZE

头文件

#ifndef __QUEUE_H__
#define __QUEUE_H__
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;

#define MAX_SIZE 5

#define CREATE_THREAD_SAFE() \
{ \
if(m_bThreadSafe) \
{ \
m_Mutex = CreateMutex(NULL, FALSE, NULL); \
} \
}

#define DESTROY_THREAD_SAFE() \
{ \
if(m_bThreadSafe) \
{ \
CloseHandle(m_Mutex); \
} \
}

#define THREAD_SAFE_LOCK() \
{ \
if(m_bThreadSafe) \
{ \
WaitForSingleObject(m_Mutex, INFINITE); \
} \
}

#define THREAD_SAFE_UNLOCK() \
{ \
if(m_bThreadSafe) \
{ \
ReleaseMutex(m_Mutex); \
}\
}

class Queue
{
public:
Queue(bool threadSafe = false);
//Queue(int maxSize, bool threadSafe = false);

int insert(int value);
int pop();
int size();

void printQ();
private:
int m_nData[MAX_SIZE];
bool m_bThreadSafe;
int m_nFront;
int m_nRear;
int m_size;

HANDLE m_Mutex;
};
#endif

cpp文件
Queue::Queue(bool threadSafe)
:m_bThreadSafe(threadSafe)
,m_nFront(0)
,m_nRear(0)
,m_size(0)
{
CREATE_THREAD_SAFE();
}

int Queue::insert(int value)
{
int retVal = -1;

THREAD_SAFE_LOCK();
if(size() == MAX_SIZE)//full
{
retVal = -1;
}
else
{
m_nData[m_nRear] = value;
m_nRear = (m_nRear+1)%MAX_SIZE;
m_size++;

retVal = 0;
}
THREAD_SAFE_UNLOCK();

return retVal;
}

int Queue::pop()
{
int retVal = -1;

THREAD_SAFE_LOCK();
if(size() == 0)//empty
{
retVal = -1;
}
else
{
m_nFront = (m_nFront+1)%MAX_SIZE;
m_size--;
retVal = 0;
}
THREAD_SAFE_UNLOCK();

return retVal;
}

int Queue::size()
{
return m_size;
}

void Queue::printQ()
{
THREAD_SAFE_LOCK();
for(int i=0; i<size(); i++)
{
printf("%d", m_nData[(i+m_nFront)%MAX_SIZE]);
}
printf("\n");
THREAD_SAFE_UNLOCK();
}

main函数
int _tmain(int argc, _TCHAR* argv[])
{
Queue q1(true);
q1.insert(1);
q1.printQ();
q1.insert(2);
q1.printQ();
q1.insert(3);
q1.printQ();
q1.insert(4);
q1.printQ();
q1.insert(5);
q1.printQ();
q1.insert(6);
q1.printQ();
q1.pop();
q1.printQ();
q1.insert(7);
q1.printQ();

q1.pop();
q1.printQ();
q1.pop();
q1.printQ();
q1.pop();
q1.printQ();
q1.pop();
q1.printQ();
q1.pop();
q1.printQ();

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  循环数组 队列