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

来源:互联网 发布:爱信诺金税盘开票软件 编辑:程序博客网 时间:2024/06/05 17:34

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

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;}


0 0
原创粉丝点击