1. 程式人生 > >資料結構_佇列-迴圈佇列實現模擬舞伴配對問題

資料結構_佇列-迴圈佇列實現模擬舞伴配對問題

參考《資料結構》(C語言版)主編 秦鋒和http://www.cnblogs.com/xing901022/p/3534937.html部落格,這篇部落格我認為作者介紹簡單明瞭。

採用空閒一個位置的方式,即N個元素空間的迴圈佇列最多隻能存放N-1個有效元素。
1) 迴圈佇列初始化:front=rear=0;
2)入隊操作:rear=(rear+1)%size;
3)出隊操作:front=(front+1)%size;
4)判斷是否為空佇列:front==rear;
5)判斷佇列是否已滿:front=(rear+1)%size;
6)遍歷佇列各元素。

問題描述:迴圈佇列實現模擬舞伴配對問題:

1:在舞會上男女各自排成一隊,舞會開始時一次從男隊和女隊的對頭各出一人配成舞伴,如果兩隊初始人數不等,則較長的那一隊中未配對者等待下一輪舞曲。2:假設初始男女人數及性別已經固定舞會的輪數從鍵盤輸入,試模擬解決上述舞伴配對問題,要求從螢幕輸出每一輪舞伴配對名單,如果在該輪有沒有配上對的,能夠從螢幕顯示下一輪第一個出場的未配對者的姓名。

a.利用迴圈佇列模擬舞伴配對問題:在舞會上,男、女各自排成一隊。舞會開始

時。依次從男隊和女隊的隊頭各出一人配成舞伴。如果兩隊初始人數不等,則較

長的那一隊中未配對者等待下一輪舞曲。

 b. 假設初始男、

女人數及性別已經固定,

舞會的輪數從鍵盤輸入。

試模擬解決上

述舞伴配對問題。要求:從螢幕輸出每一輪舞伴配對名單,如果在該輪有未配對

的,能夠從螢幕顯示下一輪第一個出場的未配對者的姓名。

 //利用迴圈佇列模擬舞伴配對問題

#include <iostream>
#include <string>
#define MAN_SIZE 6
#define WOMAN_SIZE 4
//#define QU_NUM MAN_SIZE<WOMAN_SIZE?MAN_SIZE:WOMAN_SIZE
using namespace std;
typedef struct Queue_1{
    string data[MAN_SIZE];
    int front;
    int rear;
}MAN_Queue;    //儲存男
typedef struct Queue_2{
    string data[WOMAN_SIZE];
    int front;
    int rear;
}WOMAN_Queue;  //儲存女
typedef struct Queue{
    string data[WOMAN_SIZE][2];   //這裡定義配對的男女的名字,wan lin-----da ge   @@@@@@我以後看的時候重點關注
    int front;
    int rear;
}QU_Queue;  //儲存配對人
void InitQueue_1(MAN_Queue *q,int n,string* BB)
{
     int i;
     q->front=0;
     q->rear =0;
     for(i=0;i<n-1;i++)
{
         q->data[q->rear]=BB[i];
         q->rear++;
     }
 }
void InitQueue_2(WOMAN_Queue *q,int n,string* BB)      ////string *BB 這個地方對我這個菜鳥來說要特別注意,@@@@@@我以後看的時候重點關注

{
     int i;
     q->front=0;
     q->rear =0;
     for(i=0;i<n-1;i++)
{
         q->data[q->rear]=BB[i];
         q->rear++;
     }
 }
int getLength_1(MAN_Queue *q){
     return (q->rear-q->front+MAN_SIZE)%MAN_SIZE;
 }


void showQueue_1(MAN_Queue *q){
     int i;
     int len=getLength_1(q);
     cout<<"front";
     for(i=0;i<len;i++){
         if(q->front+i<MAN_SIZE)
             cout<<"->"+q->data[q->front+i];
         else
             cout<<"->"+q->data[q->front+i-MAN_SIZE];
     }
     cout<<"->rear"<<endl;
 }
 int getLength_2(WOMAN_Queue *q){
     return (q->rear-q->front+WOMAN_SIZE)%WOMAN_SIZE;
 }


void showQueue_2(WOMAN_Queue *q){
     int i;
     int len=getLength_2(q);
     cout<<"front";
     for(i=0;i<len;i++){
         if(q->front+i<WOMAN_SIZE)
             cout<<"->"+q->data[q->front+i];
         else
             cout<<"->"+q->data[q->front+i-WOMAN_SIZE];
     }
     cout<<"->rear"<<endl;
 }
void main()
{
int  Ture_num;
cin>>Ture_num; //舞會的輪數
MAN_Queue   *q1 = new MAN_Queue;    
WOMAN_Queue *q2 = new WOMAN_Queue;
         QU_Queue    *q3 = new QU_Queue;
         string WAN_names[MAN_SIZE-1]={"wan lin","gao peng","mei wanxin","yu yun","wang peili"};
string WOMAN_names[WOMAN_SIZE-1]={"da ge","li shizen","butiful"};
//初始化
InitQueue_1(q1,MAN_SIZE,WAN_names);
InitQueue_2(q2,WOMAN_SIZE,WOMAN_names);
showQueue_1(q1);
showQueue_2(q2);


     //配對
int i=0;
int j=0;
     q3->rear=0;
q3->front=0;
string tar_1;
string tar_2;
int rr;
while(i!=Ture_num)
{
   if((q3->rear+1)%WOMAN_SIZE != q3->front)
{
if(q1->front != q1->rear)
{
               tar_1 = q1->data[q1->front];
               q1->front = (q1->front+1)%MAN_SIZE;
}
if(q2->front != q2->rear)
{
               tar_2 = q2->data[q2->front];
               q2->front = (q2->front+1)%WOMAN_SIZE;
//}


            q3->data[q3->rear][0] =tar_1;
//cout<<q3->rear;
q3->data[q3->rear][1] =tar_2;
//cout<<q3->rear;
//cout<<QU_NUM;
            q3->rear = (q3->rear+1)%WOMAN_SIZE;
cout<<q3->data[q3->rear][0];
cout<<"------";
cout<<q3->data[q3->rear][1];
cout<<endl;
}
else
{
   if(q3->front != q3->rear)
{
tar_1=q3->data[q3->front][0];
tar_2=q3->data[q3->front][1];
q3->front = (q3->front+1)%WOMAN_SIZE;
if((q1->rear+1)%MAN_SIZE != q1->front)
{
                    q1->data[q1->rear] = tar_1;
                    q1->rear = (q1->rear+1)%MAN_SIZE;
}
   if((q2->rear+1)%WOMAN_SIZE != q2->front)
{
                    q2->data[q2->rear] = tar_2;
                    q2->rear = (q2->rear+1)%WOMAN_SIZE;
}
}
i++;
}
      
         
}
  //cout<<q1->data[q2->front]<<endl;
}
下面的http://www.cnblogs.com/xing901022/p/3534937.html部落格的摘錄,這篇部落格我認為作者介紹簡單明瞭。

迴圈佇列

迴圈佇列類似棧,但是有兩個口,一個專門用來入隊,一個專門用來出隊。由於入隊出隊不在一個埠,因此如果不適用迴圈佇列,隨著佇列的使用,儲存空間馬上就被耗光了。在迴圈佇列中,一個主要的知識點,就是如何判斷佇列為空,或者佇列滿。

這裡主要有兩個方法:

1 設定一個標記位,初始時,佇列為空,我們設定flag=0;隨著資料的使用,如果隊滿,設定flag=1;

2 使用一個空的資料位,這樣rear指標永遠也不能追上front指標。當front==rear時,佇列即為空;當(rear-front)%SIZE==SIZE時,佇列為滿

資料結構

typedef struct Queue{
    int data[MAXSIZE];
    int front;
    int rear;
}Queue;

入隊操作

複製程式碼
int inQueue(Queue *q,int num){
    if((q->rear+1)%MAXSIZE == q->front)
        return 0;
    q->data[q->rear] = num;
    q->rear = (q->rear+1)%MAXSIZE;
    return 1;
}
複製程式碼

出隊操作

複製程式碼
int outQueue(Queue *q,int *tar){
    if(q->front == q->rear)
        return 0;
    *tar = q->data[q->front];
    q->front = (q->front+1)%MAXSIZE;
    return 1;
}
複製程式碼

示例程式碼

複製程式碼
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define MAXSIZE 10
 4 
 5 typedef struct Queue{
 6     int data[MAXSIZE];
 7     int front;
 8     int rear;
 9 }Queue;
10 
11 void initQueue(Queue *q,int n);
12 void showQueue(Queue *q);
13 int getLength(Queue *q);
14 int inQueue(Queue *q,int num);
15 int outQueue(Queue *q,int *tar);
16 
17 int main()
18 {
19     Queue *q = (Queue *)malloc(sizeof(Queue));
20     initQueue(q,3);
21     showQueue(q);
22 
23     if(inQueue(q,9))
24         showQueue(q);
25 
26     int *tar = (int *)malloc(sizeof(int));
27     if(outQueue(q,tar))
28         printf("the number %d out Queue\n",*tar);
29     showQueue(q);
30 
31     if(outQueue(q,tar))
32         printf("the number %d out Queue\n",*tar);
33     showQueue(q);
34 
35     if(inQueue(q,110))
36         showQueue(q);
37 
38     if(outQueue(q,tar))
39         printf("the number %d out Queue\n",*tar);
40     showQueue(q);
41 
42     if(outQueue(q,tar))
43         printf("the number %d out Queue\n",*tar);
44     showQueue(q);
45 
46     if(outQueue(q,tar))
47         printf("the number %d out Queue\n",*tar);
48     showQueue(q);
49 
50     free(tar);
51     free(q);
52     return 0;
53 }
54 
55 void initQueue(Queue *q,int n){
56     int i;
57     q->front=0;
58     q->rear =0;
59     for(i=0;i<n;i++){
60         q->data[q->rear]=2*i+1;
61         q->rear++;
62     }
63 }
64 void showQueue(Queue *q){
65     int i;
66     int len=getLength(q);
67     printf("front-");
68     for(i=0;i<len;i++){
69         if(q->front+i<MAXSIZE)
70             printf("%d-",q->data[q->front+i]);
71         else
72             printf("%d-",q->data[q->front+i-MAXSIZE]);
73     }
74     printf("rear\n");
75 }
76 int getLength(Queue *q){
77     return (q->rear-q->front+MAXSIZE)%MAXSIZE;
78 }
79 int inQueue(Queue *q,int num){
80     if((q->rear+1)%MAXSIZE == q->front)
81         return 0;
82     q->data[q->rear] = num;
83     q->rear = (q->rear+1)%MAXSIZE;
84     return 1;
85 }
86 int outQueue(Queue *q,int *tar){
87     if(q->front == q->rear)
88         return 0;
89     *tar = q->data[q->front];
90     q->front = (q->front+1)%MAXSIZE;
91     return 1;
92 }
複製程式碼

執行結果