数据结构--队列实现舞伴配对问题

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

 

(C语言版本)       运行平台visual studio 2008

#include <stdio.h>
#define maxsize 7
typedef  int  elemtype;

typedef struct  
    {
  elemtype  queue[maxsize];      
     int front, rear;
  }queuetype;

//初始化男队的人数
void  initmalequeue(queuetype  *qmale)
 {
      qmale->front=qmale->rear=maxsize – 1; 
 }

//初始化女队的人数 
void  initfemalequeue(queuetype  *qfemale)
 {
      qfemale->front=qfemale->rear=(maxsize-2) – 1; 
 }

void  menter(queuetype  *Q, elemtype x, int max)  //男队入队操作
{
 if ((Q->rear+1)% max == Q->front )  
  printf(“overflow/n”);  //判断是否队满
  else
    {
  Q->rear++;   //队尾指针后移
  Q->queue[Q->rear%max] = x;   //新元素赋给队尾单元
      }
}

void  fenter(queuetype  *Q, elemtype x, int max)  //女队入队操作
{
 if ((Q->rear+1)% max == Q->front )  
  printf(“overflow/n”);  //判断是否队满
  else
    {
  Q->rear++;   //队尾指针后移
  Q->queue[Q->rear%max] = x;   //新元素赋给队尾单元
      }
}

void mput(queuetype  *Q, int max)  //男队出队操作
{
 if  (Q->front == Q->rear)  
  printf(“underflow/n”);  //判断是否对空
 else   
 {
  printf(“%2d”, Q->queue[(Q->front+1)%max]);
  (Q->front++)%max; // 删除结点
 }
}

void fput(queuetype  *Q, int max)  //女队出队操作
{
 if  (Q->front == Q->rear)  
  printf(“underflow/n”);  //判断是否对空
 else   
 {
  printf(“%2d”, Q->queue[(Q->front+1)%max]);
  (Q->front++)%max; // 删除结点
 }
}

void maleEnter(queuetype  *Q)  //模拟1-5位整数测试男队入队
{
 int i;
 initmalequeue(Q);
 for (i = 1; i < maxsize; i++)
 {
  menter(Q, i, maxsize);
 }
}

void femaleEnter(queuetype  *Q)  //模拟1-3位整数测试女队入队
{
 int i;
 initfemalequeue(Q);

 for (i = 1; i < (maxsize – 2); i++)
 {
  fenter(Q, i, (maxsize-2));
 }
}

void main()
{
 queuetype m;
 queuetype f;
 queuetype *male;
 queuetype *female;

 male = &m, female = &f;
 
    //男女入队,并初始化
  maleEnter(male);
  femaleEnter(female);
  //男女首次出队
  printf(“男队 女队/n”);
  mput(male, maxsize);
  fput(female, (maxsize-2));
  putchar(‘/n’);
  while (1) //循环测试
  {
   //当男女人数又都从1开始排时,循环结束
   if (male->queue[(male->front+1)%maxsize]==1
    && female->queue[(female->front+1)%(maxsize-2)]==1) 
   {
    printf(“配对跳舞已经完成/n”);
    break;
   }
   if (male->front%maxsize == (male->rear)%maxsize)
   {
    printf(” 男队人数已经全部配对跳舞/n”);
    maleEnter(male);
    continue;
   }
   if (female->front%(maxsize-2) == (female->rear)%(maxsize-2))
   {
    printf(” 女队人数排完了——一个曲目的舞蹈结束!/n”);
    femaleEnter(female);
    continue;
   }
   //男女对出队操作
   mput(male, maxsize);
   fput(female, (maxsize – 2));
   printf(“/n”); 
  }
}

    原文作者:舞伴问题
    原文地址: https://blog.csdn.net/zuoyingyaya/article/details/4512957
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞