循环队列的存储空间
如果要存储m个元素,queuesize=m+1;
队列的两个指针rear和front
头指针front:队列在队头的位置删除数据;
尾指针rear:队列在队尾的位置插入数据;
初始化队列
rear=front=queuesize-1;//这样可以让第一个数据存在data[0],其他位置也可以
入队
void enqueue(int x){
rear=(rear+1)%queuesize;//队尾指针在循环意义上加一,如果rear<queuesize-1,正常++,否则跳到data[0]
data[rear]=x;
}
出队
void dequeue(){
front=(front+1)%queuesize;//和入队类似,只是头指针移动而不删除空间
//更改于2019.10.23 9:26
//一定是对队列的空间长度求余,而不是出队元素的个数m
}
判断队空和队满
队空时,随着头指针移动,数据全部出队,最后一个出队的是rear所指的的位置,因此rear=front;
队满时,随着尾指针的移动,数据全部入队,最后一个入队的位置是front所指的位置,这时候front=rear,和队空时一样,我们可以浪费一个空间,当 (rear+1) % queuesize = front 时,视为队满;
(这就是文章开头存储m个元素时,queuesize = m+1 的原因)
示例
循环队列的操作
Time Limit: 1000/2000 MS (C/Others) Memory Limit: 32768/32768 K (C/Others)
Problem Description:
现有一长度为n的整数序列和一最大容量为m的循环队列(用长为m+1的一维数组实现),要求将该序列中的偶数存入循环队列中;当循环队列满时,将循环队列中的所有元素全部出队,并按存入的先后顺序在同一行内依次输出,即每行输出m个元素,每个元素后输出一个空格。
Input:
有多组数据,每组第一行为整数序列的个数n和循环队列的最大容量m(m<=n<=100,0<m<10);第二行为整数序列的各个元素。
Output:
有多行数据,先输出对应行号,每行输出m个元素,均为偶数,每个元素后输出一个空格。
Sample Input:
10 4
9 10 2 7 16 8 12 4 3 1
10 3
9 10 2 7 16 8 12 1 3 4
Sample Output:
1:10 2 16 8
1:10 2 16
2:8 12 4
代码
#include<iostream>
using namespace std;
int data[10];
int rear,front,m,c;
void initqueue(int x){
rear=(rear+1)%m;
data[rear]=x;
}
void dequeue(){
front=(front+1)%m;
cout<<data[front]<<" ";
}
int main(){
int n;
int a[100];
while(cin>>n>>m){
m++;
rear=front=m-1;
int c=1;
for(int i=0;i<n;i++){
cin>>a[i];
if(a[i]%2==0)
initqueue(a[i]);
if((rear+1)%m==front){
cout<<c<<":";
while(front!=rear){
dequeue();
}
cout<<endl;
c++;
}
}
}
return 0;
}