近期因为要反反复复使用队列,而队列需要保存的元素格式又千差万别,在网上搜了下貌似双边队列可以解决这个问题,但是效率有点低。于是自己写了个基于模版的循环队列实现方式,有任何不合理之处还请各位大牛轻怕。
#pragma once
template<class T> // Template declaration
class CQueue
{
public:
CQueue(void);
CQueue(int num);
~CQueue(void);
private:
unsigned int rear,front,maxsize,currentcout;
T* elements;
public:
int Add(T element);
T* FetchElement();// get current element and delete it form the queue
T* ProbeElement();// get current element and retain it form the queue
int Delete();
int IsEmpty();
int IsFull();
void InitElements();
int InitElements(int num);
void Destroy();
};
template<class T>
CQueue<T>::CQueue(void)
{
}
template<class T>
CQueue<T>::~CQueue(void)
{
if (elements)
{
delete []elements;
}
}
template<class T>
CQueue<T>::CQueue(int num)
{
elements = new T[num];
rear=front=0;
maxsize = num;
currentcout = 0;
}
template<class T>
int CQueue<T> ::Add(T element)
{
if(currentcout!=maxsize)//((rear+1)%N!=front)
{
elements[rear]=element;
rear=(rear+1)%maxsize;
currentcout++;
}
else
return -1;
return 0;
}
template<class T>
int CQueue<T>::Delete()
{
if(currentcout == 0)
return -1;
else
{
front=(front+1)%N;
currentcout--;
}
return 0;
}
template<class T>
T* CQueue<T>::FetchElement()
{
T*temp = NULL;
if(currentcout==0)
{
return NULL;
}
else
{
temp = &elements[front];
front=(front+1)%maxsize;
currentcout--;
}
return temp;
}
template<class T>
T* CQueue<T>::ProbeElement()
{
if(currentcout==0)
return NULL;
else
return &elements[front];
}
template<class T>
int CQueue<T>::IsEmpty()
{
return currentcout == 0;
}
template<class T>
int CQueue<T>::IsFull()
{
return currentcout == maxsize;
}
/*
- using for init elements when you do not want to destroy CQeue object
but want to give up elements already stored
*/
template<class T>
void CQueue<T>::InitElements()
{
rear = front = 0;
currentcout = 0;
}
/*
- using for init elements when you want to destroy current memory used for store elements
and allocate a new memory area with length num
*/
template<class T>
int CQueue<T>::InitElements(int num)
{
if (elements)
{
delete elements;
}
try{
elements = new T[num];
rear = front = 0;
currentcout = 0;
maxsize = num;
return 0;
}
catch( const bad_alloc& e ){
(void )e;
return -1;
}
}
template<class T>
void CQueue<T>::Destroy()
{
rear = front = 0;
currentcout = 0;
maxsize = 0;
if (elements)
{
delete [] elements;
}
}