队列:只允许在一端进行插入操作(队尾),在另一端进行删除操作的线性表(队头)。先进先出。
循环队列:为了解决假溢出的问题;循环队列有两个指针,rear尾指针和front头指针(相当于数组的下标)
队空:rear和front指在同一个位置,即:rear==front;
队满:(rear+1)%QueueSize==front。
QueueSize是指的队列的元素的个数
实现:
#include<iostream>
using namespace std;
const int QueueSize=100;
template<class DataType>
class CirQueue
{
private:
DataType data[QueueSize];//存放队列的数组
int front,rear;//队头和队尾指针,,相当于数组的下标
public:
CirQueue();//构造函数
~CirQueue(){}//析构函数、、
void EnQueue(DataType x);//入队
DataType DeQueue();//出队
DataType getQueue();//读取队头元素
int Empty();//判空
};
template<class DataType>
CirQueue<DataType>::CirQueue()
{
rear=front=QueueSize-1;//初始化一个空队列,假设头指针和尾指针都在最高处,即数组下标最大的地方
}
template<class DataType>
void CirQueue<DataType>::EnQueue(DataType x)
{
if((rear+1)%QueueSize==front) throw "上溢";
rear=(rear+1)%QueueSize;//尾指针在循环意义下加1
data[rear]=x;
}
template<class DataType>
DataType CirQueue<DataType>::DeQueue()
{
if(rear==front)throw "下溢";
front=(front+1)%QueueSize;//头指针在循环意义下加1
DataType x=data[front];
return x;
}
template<class DataType>
DataType CirQueue<DataType>::getQueue()
{
if(rear==front) throw"下溢";
DataType x;
x=(front+1)%QueueSize;//注意不要给头指针赋值,因为取出队头元素不需要改变指针。
return x;
}
template<class DataType>
int CirQueue<DataType>::Empty()
{
if(front==rear)
return 1;
else
return 0;
}
int main()
{
CirQueue<int> c1;
int a[5];
for(int i=0;i<5;i++)
{
cin>>a[i];
c1.EnQueue(a[i]);
}
for(int i=0;i<5;i++)
{
cout<<c1.DeQueue()<<" ";
}
cout<<endl;
cout<<c1.Empty();
return 0;
}