在顺序队列中当有元素进队列时,尾指针加1。有时当reart指向数组中最后一个位置时,数组并没有满,元素出队列后,数组前面的位置有空,所以并不需要像栈那样再申请空间。
为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列。
当队列满或空时头指针和尾指针都相等,所以一般数组的最后一个位置不添加元素用作区别队列满还是空。
#include<iostream>
using namespace std;
template<typename T>
class Queue
{
public:
Queue(int i=10);
~Queue(){};
int QueueLength();
void EnQueue(T e);
T DeQueue(T &e);
bool isEmpty();
private:
int front;
int rear;
int size;
T *base;
};
template<typename T>
Queue<T>::Queue(int i=10)
{
size=i;
base=new T[i];
front=rear=0;
}
template<typename T>
int Queue<T>:: QueueLength()
{
return (rear-front+size)%size;
}
template<typename T>
void Queue<T>::EnQueue(T e)
{
if((rear+1)%size==front)
cout<<"ERROR:队列已满"<<endl;
base[rear]=e;
rear=(rear+1)%size;
}
template<typename T>
T Queue<T>::DeQueue(T &e)
{
if(front==rear)
cout<<"ERROR:队列已空"<<endl;
e=base[front];
front=(front+1)%size;
return e;
}
template<typename T>
bool Queue<T>:: isEmpty()
{
return rear==front;
}
int main()
{
Queue<int> a(10);
int e;
for(int i=0;i<9;i++)
{
cout<<i<<"进队列"<<endl;
a.EnQueue(i);
}
if(a.isEmpty())
cout<<"队列为空"<<endl;
else
cout<<"不空"<<endl;
cout<<"队列的长度为:"<<a.QueueLength()<<endl;
cout<<"退出队列"<<endl;
for(int i=0;i<9;i++)
cout<<a.DeQueue(e)<<endl;
return 0;
}