小白也能看懂的c语言队列入门问题——舞伴问题

数据结构(舞伴问题)——队列问题解决

舞伴问题:假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。

分析

  • 先入队的女士和男士先出队配成舞伴

  • 首先要实现用队列来存放男女跳舞人员

  • 初始化两个队列(男队和女队)

//--------跳舞者个人信息----------
typedef struct
{
  char name[20];     //姓名,字符串类型
  char sex; 	//性别,'F'表示女性,'M'表示男性
}Person;
//--------队列的顺序储存结构------------
typedef struct
{
  Person *base;       //队列中数据类型元素为Person
  int front;       //头指针值
  int rear;        //尾指针值
}SqQueue;
SqQueue Mdancers,Fdancers;       //分别存放男士和女士入队者队列
const int MAXSIZE=100;   //队列可能达到的最大长度,这里用#define都行,个人习惯
具体算法步骤:
  • 假设男士和女士的记录存在一个数组中作为输入

  • 构造完成后,根据遍历分别进队

  • 当有一队为空时,输出另一队第一人的名字

  • 遍历男队和女队同时出队配对

    注:

    代码大部分为自己编撰,肯定会有很多小问题,望大佬指点;

#include"bits/stdc++.h"     //#include"iostream"也行
using namespace std;
typedef char ElemType;      
typedef int Status;
const int MAXSIZE=100;       /*
const int OK=1;                这里是给函数返回值类型定义
const int ERROR=0;          */
typedef struct
{
  char name[MAXSIZE];
  char sex; 	
}Person;
typedef struct
{
  Person *base;
  int front;
  int rear;
}SqQueue;
Status InitQueue(SqQueue &Q)        //队列初始化
{
  Q.base=new Person[MAXSIZE];
  if(!Q.base) return ERROR;
  Q.front=Q.rear=0; 
  return OK;
}
Status EnQueue(SqQueue &Q,Person e)         //e元素入队列Q
{
  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,Person &e)         //将队列最前面的元素赋给e并出队
{
  if(Q.front==Q.rear) return ERROR;
  e=Q.base[Q.front];
  Q.front=(Q.front+1)%MAXSIZE;
  return OK;
}
Status QueueEmpty(SqQueue &Q)          //判断队是否为空
{
  if(Q.front==Q.rear) return OK;
  else return ERROR; 
}
Person GetHead(SqQueue Q)          //取队头元素
{
  if(Q.front!=Q.rear)
  return Q.base[Q.front];
}
void DancePratner(Person dancer[],int num)
//结构数组dancer中存放跳舞的男女,num为跳舞的人数
{
	SqQueue Mdancers;      //男队初始化
	SqQueue Fdancers;      //女队初始化
	Person p;
	InitQueue(Mdancers);
	InitQueue(Fdancers);
	for(int i=0;i<num;i++)          //依次将跳舞队根据其性别入队
	{
		p=dancer[i];
		if(p.sex=='F')      
		EnQueue(Fdancers,p);       //插入女队
		else EnQueue(Mdancers,p);       //插入男队
	}
	cout<<"The dancing partners are:\n";
	while(!QueueEmpty(Fdancers)&&!QueueEmpty(Mdancers))
	{//依次输出男女舞伴的姓名
		DeQueue(Fdancers,p);     //女士出队
		cout<<p.name<<",";       //输出出队女士姓名
		DeQueue(Mdancers,p);       //男士出队
		cout<<p.name<<endl;        //输出出队男士姓名
	}
	if(!QueueEmpty(Fdancers))      //判断女士队列是否为空
	{
		p=GetHead(Fdancers);           //取女士队头元素
		cout<<"The first woman to get partner is:"<<p.name<<endl;
	}
	else if(!QueueEmpty(Mdancers))        //男士队列是否为空
	{
		p=GetHead(Mdancers);          //取男队队头
		cout<<"The first man to get a partner is"<<p.name<<endl;
	}
}
int main()
{
	SqQueue Mdancers,Fdancers;
	Person dancer[MAXSIZE];
	int num;
	cout<<"请输入参加舞会的人数:"<<endl;
	cin>>num;
	cout<<"请输入参加舞会人员信息"<<endl;
	for(int i=0;i<num;i++)                  //建立参加舞会人员数组
	{
		cout<<"请输入"<<i+1<<"个人员信息:";
		cin>>dancer[i].name>>dancer[i].sex;        //分别将男女插入数组中
	}
	DancePratner(dancer,num);       //男女舞伴配对
	return 0;
}

小结:

舞伴问题很好的考察数据结构的问题,但并未考察到循环队列,此题是简化版的,完全可以让男女舞伴循环配对;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值