舞伴問題(循環隊列)

問題

在這裏插入圖片描述

//循環隊列
#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);
		}
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章