队列:先进先出(FIFO)或者后进后出(LILO)
#ifndef __QUEUE_H_
#define __QUEUE_H_
#include <iostream>
#include <algorithm>
using namespace std;
template <class T>
class Queue
{
public:
Queue(int capacity=10); //构造函数默认大小为10
~Queue(); //析构函数 释放myqueue
bool isEmpty ()const; //判断是否为空
// bool isFull ()const; //判断是否队列满
T& Front()const; //查看队首元素
T& Rear()const; //查看队尾元素
void Push(const T &item); //入队列
void Pop(); //出队列
private:
T *myqueue;
int Capacity; //队列大小
int myFront; //队首下标
int MyRear; //队尾下标
};
template<class T>
Queue<T>::Queue(int capacity):Capacity(capacity) //初始化构造函数
{
if(capacity<1)
throw "Error"; //引发异常
myqueue=new T[capacity]; //动态创建一个数组
myFront=MyRear=0; //队首和队尾指向0
}
template<class T>
Queue<T>::~Queue()
{
delete []myqueue;
}
template<class T>
bool Queue<T>::isEmpty () const //判断是否为空
{
return myFront==MyRear;
}
template<class T>
T& Queue<T>::Front() const //查看队首元素
{
if(isEmpty())
throw "Queue is Empty";
return myqueue[(myFront+1)%Capacity]; //因为myFront指向的队列不包含数据,所以第一个数据是myFront+1,因为组成循环队列,所以%Capacity
}
template<class T>
T& Queue<T>::Rear() const //查看队尾元素
{
if(isEmpty())
throw "Queue is Empty";
return myqueue[MyRear]; //返回队尾数据
}
template<class T>
void Queue<T>::Push(const T& item) //从队尾(rear)插入数据
{
if(((MyRear+1)%Capacity)==myFront)
{
T *temp=new T[Capacity*2]; //扩大两倍大小
int start=(myFront+1)%Capacity;
if(start<2) //rear没有回环
{
copy(myqueue+start,myqueue+start+Capacity-1,temp); //复制数据到temp里面
}
else //产生回环 需要复制两次
{
copy(myqueue+start,myqueue+start+Capacity-1,temp);
copy(myqueue,myqueue+MyRear+1,temp+Capacity-start);
}
myFront=2*Capacity-1; //把front重新归位
MyRear=Capacity-1;
Capacity=Capacity*2;
delete []myqueue; //删除原数据
myqueue=temp; //把新指针重新赋值给muqueue
}
else
{
MyRear=(MyRear+1)%Capacity; //MyRear+1
}
myqueue[MyRear]=item;
}
template <class T>
void Queue<T>::Pop() //出队列
{
if(isEmpty())
throw "Queue is Empty";
myFront=(myFront+1)%Capacity;
myqueue[myFront].~T();
}
#endif // __QUEUE_H_
main函数:
#include <iostream>
#include "Queue.h"
using namespace std;
int main()
{
Queue<int> q;
q.Push(11);
q.Push(10);
q.Push(2);
q.Push(1);
q.Push(9);
cout<<q.Front()<<" "<<q.Rear()<<endl;
//cout<<<<" ";
q.Push(68);
cout<<q.Front()<<" "<<q.Rear()<<endl;
q.Pop();
cout<<q.Front()<<" "<<q.Rear()<<endl;
return 0;
}