队列的顺序存储——循环队列

时间:2021-11-23 17:38:10

队列允许在一端进行插入操作,在另一端进行删除操作的线性表。

1.允许插入(也称入队、进队)的一端称为队尾,允许删除(也称出队)的一端称为队头

队列的这种首尾相接的顺序存储称为循环队列

1.为了实现元素出队之后,不移动其他的数据元素,并且可以循环利用空闲下来的数组空间。

2.队空的条件:start==rear。

3.队满的条件:(rear+1)%QueueSize==start。


代码:

#include<iostream>

using namespace std;

const int MaxSize=100;

class CirQueue
{
private:
int data[MaxSize];
int start,rear;
public:
CirQueue(){start=rear=MaxSize-1;}
CirQueue(int a[],int n);
~CirQueue(){}
void EnQueue(int x);
int DeQueue();
int GetQueue();
int Empty();
void Destroy();
void PrintStack();
};
CirQueue::CirQueue(int a[],int n)
{
start=rear=MaxSize-1;
if((rear+1)%MaxSize==start) throw "上溢";
for(int i=0;i<n;i++)
{
rear=(rear+1)%MaxSize;
data[rear]=a[i];
}
}
void CirQueue::EnQueue(int x)
{
if((rear+1)%MaxSize==start) throw "上溢";
rear=(rear+1)%MaxSize;
data[rear]=x;
}
int CirQueue::DeQueue()
{
if(start==rear) throw "下溢";
start=(start+1)%MaxSize;
return data[start];
}
int CirQueue::GetQueue()
{
if(start==rear) throw "下溢";
int i=(start+1)%MaxSize;
return data[i];
}
int CirQueue::Empty()
{
if(rear==start) return 1;
else return 0;
}
void CirQueue::Destroy()
{
while(start!=rear)
{
start=(start+1)%MaxSize;
}
}
void CirQueue::PrintStack()
{
for(int i=(start+1)%MaxSize;i<=rear;i++)
{
cout<<data[i]<<" ";
}
cout<<endl;
}
int main()
{
int a[5]={4,0,5,9,7};
CirQueue cq(a,5);
cq.EnQueue(1);
cq.PrintStack();
cq.EnQueue(2);
cq.PrintStack();
cout<<cq.GetQueue()<<endl;

cq.EnQueue(3);
cq.PrintStack();

cout<<cq.Empty()<<endl;
cout<<cq.GetQueue()<<endl;

cout<<cq.DeQueue()<<endl;
cq.PrintStack();

cq.Destroy();
cq.PrintStack();
cout<<cq.Empty()<<endl;

return 0;
}