#include<iostream>
using namespace std;
//顺序存储的循环队列

const int maxsize=5;

class cir_queue{//Circular queue 循环队列
public:
    int data[maxsize];
    int front;
    int rear;

    cir_queue(const int temp[],int num1);//创建一个队列
    void show();//查看对头元素
    void in_queue(int e);//入队
    int out_queue();//出队
    int length();//求队列长度
};
cir_queue::cir_queue(const int temp[],int num1){
    for(int p=0;p<num1;p++){
        data[p]=temp[p];
        if(p==0){
            front=p;
            rear=p;
        }
        rear=p+1;
    }
}

void cir_queue::show(){
    if(front==rear){//队空的判断
        cout<<"此时为空队列"<<endl;
        return;
    }
    cout<<"对头元素为"<<data[front]<<endl;
}

void cir_queue::in_queue(int e){//入队
    if((rear+1)%maxsize==front){//队满的判断 此处存在数组溢出问题1
        cout<<"队列已满"<<endl;
        return;
    }
    data[rear]=e;
    rear=(rear+1)%maxsize; 
}

int cir_queue::out_queue(){//出队 返回出队元素
    if(front==rear){
        cout<<"队列为空"<<endl;
        return 0;
    }
    int e=data[front];
    front=(front+1)%maxsize;
    return e;
}
int cir_queue::length(){//返回队列长度
    return (rear-front+maxsize)%maxsize;
}

int main(){
    int arr[maxsize];
    int num,k;

    cout<<"输入创建顺序存储的循环队列的大小"<<endl;
    cin>>num;

    if(num>=maxsize){
        cout<<"输入不合法"<<endl;
        return 0;
    }
    for(int j=0;j<num;j++){
        cout<<"输入第"<<j+1<<"个元素的值"<<endl;
        cin>>k;
        arr[j]=k;
    }

    cir_queue q1(arr,num);
    //q1.in_queue(100);
    int n=q1.out_queue();
    cout<<"出队的元素为"<<n<<endl;
    cout<<"队列长度为"<<q1.length()<<endl;
    q1.show();

    return 0;
}
/*
数组溢出问题:
此时的队列结构为 front指向队头元素,rear指向队尾元素的下一位,也就是此元素数组下标的下一位
对于数组来说 总有一个下标的空间是不能被赋值的
设计这样结构好处为: 判断队空(front==rear)和队满((rear+1)%maxsize==front)简单易区分
缺点为:如果数组的最大容量(maxsize)较小的话,此时的循环队列不要也罢
*/

 

版权声明:本文为dageng2844原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dageng2844/p/14335937.html