Queue.h
#ifndef QUEUE_H_
#define QUEUE_H_
using namespace std;
template <class T>
class Queue
{
public:
Queue(int queueCapacity=10);
bool IsEmpyt()const;
T &Front()const; //查看队首数据
T &Rear()const; //查看队尾数据
void Push(const T& item);
void Pop();
private:
T *queue;
int front;//记录队首下标
int rear;//记录队尾下标
int capacity;
};
template <class T>
Queue<T>::Queue(int queueCapacity):capacity(queueCapacity)
{
if(capacity < 1)
throw "Queue capacity must be > 0";
queue = new T[capacity];
front = rear = 0;
}
template <class T>
inline bool Queue<T>::IsEmpyt()const
{
return front == rear;
}
template <class T>
void Queue<T>::Push(const T& item)
{
if((rear+1)%capacity == front)//队列满了
{
T *newQueue = new T[2*capacity];
int start = (front+1) % capacity;
if(start<2) //没有发生回绕
copy(queue+start,queue+start+capacity-1,newQueue);
else
{
copy(queue+start,queue+capacity,newQueue);
copy(queue,queue+rear+1,newQueue+capacity -start);
}
front = 2 *capacity -1;
rear = capacity -2;
capacity *=2;
delete [] queue;
queue = newQueue;
}
if(rear == capacity-1)
rear = 0;
else
rear++;
queue[rear] = item;
/*rear = (rear+1) % capacity
queue[rear] = item;
*/
}
template <class T>
inline T &Queue<T>::Front()const
{
if(IsEmpyt())
throw "Queue is Empty ";
return queue[(front+1)%capacity];
}
template <class T>
inline T &Queue<T>::Rear()const
{
if(IsEmpyt())
throw "Queue is Empyt";
return queue[rear];
}
template <class T>
void Queue<T>::Pop()
{
if(IsEmpyt())
throw "Queue is empty";
front = (front+1) % capacity;
queue[front].~T();
}
#endif