循环队列(模板)

思路:

1.创建一个结构体用来表示循环队列:一个数组,一个队首head,一个队尾rear

2.初始化循环队列:head==rear=0;

3.如果head==rear,则队列为空

4.如果(rear+1)%(n+1)==head,则循环队列为满,注意是由于是循环队列,所以要取余才能得到正确的下标,注意由于对于循环队列会浪费一个空间,所以要申请n+1个空间,所以要取余(n+1)

5.将元素插入循环队列中,只要队列未满,则存到rear的位置,再让(rear+1)%(n+1)

6.输出队首元素,让队首元素出队列,head后移动一位,(head+1)%(n+1)

代码:

#include<iostream>
using namespace std;
const int N=100005;
int n,q,x;
string op;
//设置一个结构体表示循环队列:
//一个数组,一个队首head,一个队尾rear
//初始化为空的循环队列:head=rear=0;
struct queue{
    int q[N];
    int head;
    int rear;
    queue(){
        head=rear=0;
    }
};
//将元素插入到循环队列中:
//先判断一下循环队列是否满,由于对于循环队列,如果发现当前的尾指针的下一个
//位置就是队首,就浪费rear的那个空间,就表示循环队列已经满了
//由于题目中说能够存n个节点,又由于循环队列会浪费一个空间
//所以需要申请n+1个空间才能存n个节点
void push(queue& que,int x){
    //先判断一下循环是否满了:(rear+1)%(n+1)==head,满了,注意是n+1不是n
    if((que.rear+1)%(n+1)==que.head){
        cout<<"full"<<endl;
    }else{
        //如果没满,就存在rear的位置,再将rear后移动一位
        //由于是循环队列,所以每次移动都要取模(n+1)才能得到正确的下标
        que.q[que.rear]=x;
        que.rear=(que.rear+1)%(n+1);
    }
}
//如果head==rear,则表示循环队列为空
bool empty(queue& que){
    return que.head==que.rear;
}
//只要循环队列不为空,就输出队首元素
int front(queue& que){
    return que.q[que.head];
}
//让队首元素出队,head向后移动一位,注意不要忘记取余(n+1)
int pop(queue& que){
    int temp=que.q[que.head];
    que.head=(que.head+1)%(n+1);
    return temp;
}
int main(){
    cin>>n>>q;
    queue que;
    for(int i=1;i<=q;i++){
        cin>>op;
        if(op=="push"){
            cin>>x;
            push(que,x);
        //如果队列为空,则输出error
        }else if((empty(que))){
            cout<<"empty"<<endl;
        }else if(op=="front"){
            cout<<front(que)<<endl;
        }else if(op=="pop"){
            cout<<pop(que)<<endl;
        }
    }
    return 0;
}