采用空闲一个位置的方式,即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; 

 }


下面的博客的摘录,这篇博客我认为作者介绍简单明了。


循环队列



循环队列类似栈,但是有两个口,一个专门用来入队,一个专门用来出队。由于入队出队不在一个端口,因此如果不适用循环队列,随着队列的使用,存储空间马上就被耗光了。在循环队列中,一个主要的知识点,就是如何判断队列为空,或者队列满。

这里主要有两个方法:

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;



入队操作



数据结构Java队列简单舞伴问题_#define



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;
}



数据结构Java队列简单舞伴问题_#define



出队操作



数据结构Java队列简单舞伴问题_#define



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;
}



数据结构Java队列简单舞伴问题_#define



示例代码



数据结构Java队列简单舞伴问题_#define



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 }



数据结构Java队列简单舞伴问题_#define



运行结果


数据结构Java队列简单舞伴问题_i++_07