循环队列(模板)
思路:
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;
}