循环队列之舞伴问题(含源码详解)
生活随笔
收集整理的這篇文章主要介紹了
循环队列之舞伴问题(含源码详解)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.問題描述
假設在周末舞會上,男士和女士進入舞廳,各自排成一隊,跳舞開始時,依次從男隊和女隊的隊頭各出一人配成舞伴。若兩隊初始人數不相同,那么較長的那一對中未配對者等待下一輪舞曲,試寫一種算法模擬上面的舞伴問題
2.問題分析
我們可以看出這是一個典型的隊列問題,我們只需要把男士隊和女士隊看成隊列,我們可以把男士和女士的信息都存儲在一個數組中,再根據不同的性別存儲到不同的隊列中。然后開始給隊列配對,當有一個隊列為空的時候,另外一個隊列有等待者,則輸出隊頭等待者的姓名,此人將是下一個可以獲得舞伴的人
3.代碼分析
#include<iostream> using namespace std; #define MAXSIZE 100 #define Status int #define OK 1 #define ERROR 0 #define QElemType Person typedef struct{//跳舞者的個人信息 char name[20];char sex; }Person; typedef struct{Person *base;int font;int rear; }SqQueue; Status InitQueue(SqQueue &Q)//隊列初始化 {Q.base=new QElemType[MAXSIZE];if(!Q.base)exit(0);Q.font=Q.rear=0;return 0; } Status EnQueue(SqQueue &Q,QElemType e)//入隊 {if((Q.rear+1)%MAXSIZE==Q.font)return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXSIZE;return OK; } Status DeQueue(SqQueue &Q,QElemType &e)//出隊 {if(Q.font==Q.rear)return ERROR;e=Q.base[Q.font];Q.font=(Q.font+1)%MAXSIZE;return OK; } QElemType GetHead(SqQueue Q)//得到隊列頭元素 {if(Q.font!=Q.rear)return Q.base[Q.font]; } Status QueueEmpty(SqQueue Q) {if(Q.font==Q.rear)return OK;return ERROR; } void DancePartner(Person dance[],int num)//dance表示跳舞男女的信息,num表示跳舞的人數 {SqQueue Mdancers,Wdancers;Person p;InitQueue(Mdancers);InitQueue(Wdancers);for(int i=0;i<num;i++){p=dance[i];if(p.sex=='M')EnQueue(Mdancers,p);elseEnQueue(Wdancers,p); }cout<<"The dancing partners are:\n";while(!QueueEmpty(Wdancers)&&!QueueEmpty(Mdancers)){DeQueue(Wdancers,p);cout<<p.name<<" ";DeQueue(Mdancers,p);cout<<p.name<<endl;}if(!QueueEmpty(Wdancers)){p=GetHead(Wdancers);cout<<"在第二輪舞曲才獲得舞伴的女士為:"<<p.name<<endl; }if(!QueueEmpty(Mdancers)){p=GetHead(Mdancers);cout<<"在第二輪舞曲才獲得舞伴的男士為:"<<p.name<<endl; }} int main() {int n;cout<<"請輸入跳舞人的個數:";cin>>n; Person dance[n];cout<<"請依次輸入跳舞人的信息\n";for(int i=0;i<n;i++){getchar(); cout<<"姓名:";cin>>dance[i].name;cout<<"性別:";cin>>dance[i].sex; }DancePartner(dance,n);}例子:
總結
以上是生活随笔為你收集整理的循环队列之舞伴问题(含源码详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用栈实现括号匹配的检验
- 下一篇: 我这么讲线索二叉树,我三岁大的表弟笑了笑