循环队列的小例子

问题:

利用循环队列模拟舞伴配对问题:在舞会上,男、女各自排成一队。舞会开始时。依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。

ih#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct
{
	char name[20];
}dancer;
typedef struct
{
	dancer * base;//分配空间
	int font;//头指针
	int rear;//尾指针
}queue;
void init(queue * q)//构造一个空队列
{
	q->base = (dancer *)malloc(MAXSIZE*sizeof(dancer));
	if(!q->base)//分配失败则退出程序
		exit(-1);
	q->font = q->rear = 0;//队列空,头指针,尾指针指向同一位置
}
void inqueue(queue * q,dancer e)//插入
{
	if((q->rear+1)%MAXSIZE == q->font)//队列满则退出程序
		exit(-1);
	q->base[q->rear] = e;
	q->rear = (q->rear+1)%MAXSIZE;//插入后移动尾指针
}
void outqueue(queue * q,dancer * e)//删除
{
	if(q->font == q->rear)//队列为空则退出程序
		exit(-1);
	* e = q->base[q->font];
	q->font = (q->font+1)%MAXSIZE;//移动头指针
}
dancer get1(queue * q)//获取队首元素
{
	dancer e;
	if(q->font != q->rear)
	e = q->base[q->font];
	return e;
}
dancer get2(queue * q)//获取第二个元素
{
	dancer e;
	e = q->base[q->font+1];
	return e;
}
int main(void)
{
	queue q1,q2;//q1为男生队列,q2为女生队列
	dancer d1[5],d2[3];//假设有5名男生,3名女生
	dancer e1,e2;
	int i,a,j;
	init(&q1);
	init(&q2);
	//输入男生,女生的名字
	printf("请输入5名男生的名字:\n");
	for(i = 0;i<5;++i)
	{
		scanf("%s",d1[i].name);
		inqueue(&q1,d1[i]);
	}
	printf("请输入3名女生的名字:\n");
	for(i=0;i<3;++i)
	{
		scanf("%s",d2[i].name);
		inqueue(&q2,d2[i]);
	}
	printf("请输入舞会的轮数:\n");
	scanf("%d",&a);
	for(i=0;i<a;++i)
	{
		printf("第%d轮的配对情况是:\n",i+1);
		//出队后需要再入队,保证下一轮配对的进行
	for(j=0;j<3;++j)
	{
		outqueue(&q1,&e1);
		inqueue(&q1,e1);
		outqueue(&q2,&e2);
		inqueue(&q2,e2);
		printf("%s-----%s\n",e1.name,e2.name);
	}
	printf("%s和%s等待下一轮\n",get1(&q1).name,get2(&q1).name);//输出下一轮等待的人,并不是出队,只需要获取值即可
	}
	return 0;
}
    原文作者:舞伴问题
    原文地址: https://blog.csdn.net/qq_31726419/article/details/50225137
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞