C++基于模版的循环队列实现

来源:互联网 发布:发廊手机收银软件 编辑:程序博客网 时间:2024/04/28 16:16

近期因为要反反复复使用队列,而队列需要保存的元素格式又千差万别,在网上搜了下貌似双边队列可以解决这个问题,但是效率有点低。于是自己写了个基于模版的循环队列实现方式,有任何不合理之处还请各位大牛轻怕。

#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;
}
}

0 0
原创粉丝点击