舞伴问题(循环队列)

问题

在这里插入图片描述

//循环队列
#include <stdio.h>
#include <stdlib.h>
#include<iostream>
#include<string>
using namespace std;
//数组结构体
typedef struct{
	char name[20];
	char sex;
}Persion;
typedef Persion * QElemType;
#define MAXSIZE 100
//循环队列
typedef struct{
	QElemType base;
	int front;
	int rear;
}SqQueue,*Sqlink;
//初始化
void InitQueue(Sqlink &Q){
	Q = (Sqlink)malloc(sizeof(SqQueue));
	Q->base = (QElemType)malloc(MAXSIZE*sizeof(Persion));
	Q->front = Q->rear = 0;
	return;
}
//入队
bool EnQueue(Sqlink &Q, QElemType p){
	if ((Q->rear + 1) % MAXSIZE == Q->front)return false;
	Q->base[Q->rear] = *p;
	/*Q->base[Q->rear].name= p->name;
	Q->base[Q->rear].sex = p->sex;*/
	Q->rear = (Q->rear + 1) % MAXSIZE;
	return true;
}
//出队
void DeQueue(Sqlink &Q, QElemType &p){
	p = Q->base+Q->front;
	Q->front = (Q->front + 1) % MAXSIZE;
	return;
}
//队空
bool EmptyQueue(Sqlink Q){
	if (Q->front == Q->rear)return true;
	return false;
}
int main(){
	Sqlink Fdancers , Mdancers;
	//Sqlink Fdancers = (Sqlink)malloc(sizeof(SqQueue)), Mdancers = (Sqlink)malloc(sizeof(SqQueue));
	InitQueue(Fdancers);
	InitQueue(Mdancers);
	QElemType temp=(QElemType)malloc(sizeof(Persion));
	int num;
	scanf("%d", &num);
	while (num--){
		cin >> temp->name;
		getchar();
		cin>>temp->sex;
		
		if (temp->sex == 'M'){
			if (!EnQueue(Mdancers, temp)){
				printf("\n队满\n");
				break;
			}
		} 
		else if (temp->sex == 'F'){
			if (!EnQueue(Fdancers, temp)){
				printf("\n队满\n");
				break;
			}
		}
	}
	printf("匹配舞伴(男/女):\n");
	while (!EmptyQueue(Mdancers) && !EmptyQueue(Fdancers)){
		DeQueue(Mdancers, temp);
		printf("%s    ", temp->name);
		DeQueue(Fdancers, temp);
		printf("%s\n", temp->name);
	}
	printf("分配完毕\n");
	if (!EmptyQueue(Mdancers) || !EmptyQueue(Fdancers)){
		printf("待配对者:\n");
		if (!EmptyQueue(Mdancers)){
			DeQueue(Mdancers, temp);
			printf("%s\n", temp->name);
		}
		else{
			DeQueue(Fdancers, temp);
			printf("%s\n", temp->name);
		}
	}

	system("PAUSE");
	return 0;
}

0.结构体

//数组结构体
typedef struct{
	char name[20];
	char sex;
}Persion;
typedef Persion * QElemType;
#define MAXSIZE 100
//循环队列
typedef struct{
	QElemType base;
	int front;
	int rear;
}SqQueue,*Sqlink;

1.循环队列的基本操作(初始化,入队,出队,判空)

提示
p是Persion*,所以 星号p 是Persion
temp也是Persion*
Q->base[Q->front]是Persion
但Q->base+Q->front是Persion*,所以 星号(Q->base+Q->front)是Persion

//初始化
void InitQueue(Sqlink &Q){
	Q = (Sqlink)malloc(sizeof(SqQueue));
	Q->base = (QElemType)malloc(MAXSIZE*sizeof(Persion));
	Q->front = Q->rear = 0;
	return;
}
//入队
bool EnQueue(Sqlink &Q, QElemType p){
	if ((Q->rear + 1) % MAXSIZE == Q->front)return false;
	Q->base[Q->rear] = *p;
	/*Q->base[Q->rear].name= p->name;
	Q->base[Q->rear].sex = p->sex;*/
	Q->rear = (Q->rear + 1) % MAXSIZE;
	return true;
}
//出队
void DeQueue(Sqlink &Q, QElemType &p){
	p = Q->base+Q->front;
	Q->front = (Q->front + 1) % MAXSIZE;
	return;
}
//队空
bool EmptyQueue(Sqlink Q){
	if (Q->front == Q->rear)return true;
	return false;
}

2.舞伴问题函数

在这里插入图片描述## 输入
输入到暂存值QElemType temp,根据性别入队
注意
队列指针Fdancers , Mdancers要分配指针的内存空间,
暂存值QElemType temp也要分配指针的内存空间

Sqlink Fdancers , Mdancers;
	//Sqlink Fdancers = (Sqlink)malloc(sizeof(SqQueue)), Mdancers = (Sqlink)malloc(sizeof(SqQueue));
	InitQueue(Fdancers);
	InitQueue(Mdancers);
	QElemType temp=(QElemType)malloc(sizeof(Persion));
	int num;
	scanf("%d", &num);
	while (num--){
		cin >> temp->name;
		getchar();
		cin>>temp->sex;
		
		if (temp->sex == 'M'){
			if (!EnQueue(Mdancers, temp)){
				printf("\n队满\n");
				break;
			}
		} 
		else if (temp->sex == 'F'){
			if (!EnQueue(Fdancers, temp)){
				printf("\n队满\n");
				break;
			}
		}
	}

输出

printf("匹配舞伴(男/女):\n");
	while (!EmptyQueue(Mdancers) && !EmptyQueue(Fdancers)){
		DeQueue(Mdancers, temp);
		printf("%s    ", temp->name);
		DeQueue(Fdancers, temp);
		printf("%s\n", temp->name);
	}
	printf("分配完毕\n");
	if (!EmptyQueue(Mdancers) || !EmptyQueue(Fdancers)){
		printf("待配对者:\n");
		if (!EmptyQueue(Mdancers)){
			DeQueue(Mdancers, temp);
			printf("%s\n", temp->name);
		}
		else{
			DeQueue(Fdancers, temp);
			printf("%s\n", temp->name);
		}
	}
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Deosiree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值