循环数组实现队列
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;
}
头文件
#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;
}
相关文章推荐
- C#线程队列用法实例分析
- 算法系列15天速成 第九天 队列
- C语言单链队列的表示与实现实例详解
- mysql 队列 实现并发读
- C#队列Queue用法实例分析
- C#多线程处理多个队列数据的方法
- C语言循环队列的表示与实现实例详解
- C++循环队列实现模型
- C#内置队列类Queue用法实例
- Array栈方法和队列方法的特点说明
- C#通过链表实现队列的方法
- C#队列Queue多线程用法实例
- C#数据结构与算法揭秘五 栈和队列
- C++中队列的建立与操作详细解析
- PHP实现的memcache环形队列类实例
- php基于双向循环队列实现历史记录的前进后退等功能
- 队列在编程中的实际应用(php)
- Go语言的队列和堆栈实现方法
- C++队列用法实例
- PHP队列用法实例