注:此代码使用的是C语言,完全可以正常运行,在代码区下方附上运行界面,解决的是队列例题的舞伴匹配问题
思路:
1.设置两个队列分别存放男士和女士入队者
2.假设男士和女士的记录存放在一个数组中作为输入,然后依次扫描该数组的各元素,并根据性别来决 定是进入男队还是女队。
3.当这两个队列构造完成之后,依次将两队当前的队头元素出队来配成舞伴,直至某队列变空为止。
此时,若某队仍有等待配对者,则输出此队列中排在队头的等待者的姓名,此人将是下一轮舞曲开始时第一个可获得舞伴的人。
代码区
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100 //定义队列最大空间
#define N 4 //4为参加人数,此处可以自由设定
typedef struct
{
char name[50]; //姓名
char sex; //性别
}Dancer;
typedef struct
{
Dancer *base;
int front; //下标值
int rear;
}SqQueue;
enum Status{ERROR,OK}; //本代码用的是枚举类型,此处可根据具体要求替换
//队列初始化
Status InitQueue(SqQueue &Q)
{
Q.base=(Dancer *)malloc(MAXSIZE*sizeof(Dancer));
if(!Q.base) return ERROR;
Q.front=Q.rear=0;
return OK;
}
//入队列
Status EnQueue(SqQueue &Q,Dancer e)
{
if((Q.rear+1)%MAXSIZE==Q.front) return ERROR; //队满-》报错
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;
return OK;
}
//出队列
Status DeQueue(SqQueue &Q,Dancer *e)
{
if(Q.front==Q.rear) return ERROR; //队空--》报错
*e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return OK;
}
//判断队列是否为空
int QueueEmpty(SqQueue Q)
{
if(Q.rear==Q.front)
return OK;
else
return ERROR;
}
int main()
{
char s;
int i=0;
SqQueue Men,Women; //定义两个队,分别为男队和女队
Dancer D,p1,p2; //D为舞者的基本信息,其中用p1,p2表示具体个人信息
InitQueue(Men);
InitQueue(Women);
printf("input your name and sex(m/w),we will arrange partner in order:"); //请您输入姓名和性别(此处用m/w表示),然后将按照签到次序为您安排舞伴
for(i=0;i<N;i++)
{
printf("\nname:"); //姓名
scanf("%s",D.name);
scanf("%c",&s); //这一步是保护下一个相邻的scanf,当然也可以同时输入 姓名和 性别
printf("sex:");
scanf("%c",&D.sex); //性别
if(D.sex=='m')
EnQueue(Men,D); //男士进男队
if(D.sex=='w')
EnQueue(Women,D); //女士进女队
}
printf("\nthese are datas about partner:"); //下面是安排情况
while(!QueueEmpty(Men)&&!QueueEmpty(Women)) //在均为非空的情况下
{
DeQueue(Men,&p1); //第一个男士出队
DeQueue(Women,&p2); //第一个女士出队
printf("\n%s(%c)&%s(%c)",p1.name,p1.sex,p2.name,p2.sex); //输出信息
}
while(!QueueEmpty(Men)) //若男队有剩余
{
DeQueue(Men,&p1);
printf("\n%s(%c) can match early in order",p1.name,p1.sex); //那么在下一轮中,会依次优先安排舞伴
}
while(!QueueEmpty(Women)) //若女队有剩余
{
DeQueue(Women,&p2);
printf("\n%s(%c) can match early in order",p2.name,p2.sex); //那么在下一轮中,会依次优先安排舞伴
}
printf("\n");
return 0;
}