循环队列的简单操作

循环队列的存储空间

如果要存储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;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值