#include <stdio.h>
#include <iostream>
using namespace std;
# define MAXSIZE 100
typedef struct {
char name[10];
char sex; //M表示男性,F表示女性
}Person;
typedef struct {
Person *base;
int front; //指向队头元素
int rear; //指向队尾元素相当于指针
}SqQueue;
void InitSqQueue(SqQueue &Q){
Q.base=new Person[MAXSIZE];
if(!Q.base){
printf("分配内存失败");
exit(0);
}
Q.front=Q.rear=0;
}
int IsEmpty(SqQueue &Q){
if(Q.front==Q.rear){
return 1;
}else
return 0;
}
int QueueLength(SqQueue &Q){
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
void EnQueue(SqQueue &Q,Person e){
if((Q.rear+1)%MAXSIZE==Q.front){
printf("队列已满");
}
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE; //通过取模操作将队列弄成循环
}
Person GetFront(SqQueue &Q){
if(Q.front==Q.rear){
printf("队列是空的");
exit(0);
}
return Q.base[Q.front];
}
void DeQueue(SqQueue &Q,Person &e){
if(Q.front==Q.rear){
printf("队列是空的");
}else{
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
}
}
void DancePartner(Person *Dancer,int& num,SqQueue MQ,SqQueue FQ){
Person e;
for(int i=0;i<num;i++){ //通过性别分配对组
if(Dancer[i].sex=='M'){
EnQueue(MQ,Dancer[i]);
}
else
EnQueue(FQ,Dancer[i]);
}
cout<<"The dancing partners are:"<<endl;
while(!IsEmpty(MQ)&&!IsEmpty(FQ)){ //舞伴匹配
DeQueue(FQ,e);
cout<<e.name<<"+";
DeQueue(MQ,e);
cout<<e.name<<endl;
}
}
int main(){
SqQueue MQ,FQ;
InitSqQueue(MQ);
InitSqQueue(FQ);
while(1){
Person *Dancer;int num=0; //每次配队人数在30以内
Dancer=new Person[30];
printf("舞伴配队;请输入人员信息性别 名字\n");
printf("一次信息录入以#结束\n");
while(1){ //要先输入性别F/M
cin>>Dancer[num].sex;
if(Dancer[num].sex=='#')
break;
cin>>Dancer[num].name;
num++;
}
DancePartner(Dancer,num,MQ,FQ);
printf("继续按1,退出按0\n");
cin>>num;
if(num==0)
break;
}
return 0;
}
顺序存储结构 -----循环队列
通过取模运算 ,头指针和尾指
针就可以在顺序表空间内以头尾
衔接的方式"循环"移动
//少用一个元素空间来分辨队空还是队满
Q.front==Q.rear 队空
(Q.rear+1)%MAXSIZE==Q.front 队满