您的位置:首页 > 理论基础 > 数据结构算法

队列的基本操作应用---舞伴问题(数据结构实验项目三)

2017-11-12 21:47 711 查看

实验项目三:队列的基本操作应用

课程名称:数据结构

实验目的:

1.掌握队列的定义及实现;

2.掌握利用队列的基本操作。

实验要求:

1、    使用链式结构完成队列的各种基本操作;

2、    补充完善教材81页的舞伴问题。

实验项目名称:队列的基本操作应用

实验过程:

1、    先建立一个舞者队列,依次往队列中添加人员信息(8个人,5男3女);

2、    分别创建男女队列;

3、    从舞者队列中依次将队首元素出队并判断其性别并添加至男队(5人)或女队(3人);

4、    分别从男队和女队出队队首元素并配对输出;(男队女队分别3人)

5、    将未完成的一队队首元素输出(男队的队首成员名称)。

实验报告中给出算法3.23的代码

 

实验结果:

输入:8人信息(A,B,C,D,E,F,G,H)

输出:The dancepartners:

A---B

      C---D

      E---F

G is waiting for a partner.

实验分析:

1.队列的操作特点;

2.列举调试运行过程中出现的错误并分析原因。

要求:

(1) 程序要添加适当的注释,程序的书写要采用缩进格式。

(2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。

(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。

(4) 上传源程序到课堂派。顺序表的源程序保存为dancepartner.cpp。

程序代码:

#include<stdio.h>
#define MAXQSIZE 100
#define QueueSize 20
#define OK 1
#define ERROR 0
#define OVERFLOW 0
#include <cstdlib>
#include<iostream>
using namespace std;

typedef char QElemType;
typedef int Status;
//typedef char SElemType;

typedef struct
{
char name[QueueSize];
char sex;
}person;

typedef struct
{
person *dancer;
person *base;       //存储空间的基地址
int front;             //头指针
int rear;              //尾指针
}SqQueue;

Status InitQueue(SqQueue &Q)
{//构造一个空队列Q
Q.base=new person[MAXQSIZE];    //为队列分配一个最大容量为MAXQSIZE的数组空间
if(!Q.base) exit(OVERFLOW);        //存储分配失败
Q.front=Q.rear=0;                  //头指针和尾指针为零,队列为空
return OK;
}

Status EnQueue(SqQueue &Q,person e)
{//插入元素e为Q的新的队尾元素
if((Q.rear+1)%MAXQSIZE==Q.front)   //尾指针在循环意义上加1后等于头指针,表明队满
return ERROR;
Q.base[Q.rear]=e;                //新元素插入队尾
Q.rear=(Q.rear+1)%MAXQSIZE;       //队尾指针加1
return OK;
}

int QueueEmpty(SqQueue &Q)
{
if (Q.front==Q.rear)   return OK;
else return ERROR;
}

Status DeQueue(SqQueue &Q,person &e)
{//删除Q的队头元素,用e返回其值
if(Q.front==Q.rear) return ERROR;   //队空
e=Q.base[Q.front];                  //保存队头元素
Q.front=(Q.front+1)%MAXQSIZE;       //队头指针加1
return OK;

}

person GetHead(SqQueue Q)
{//返回Q的队列元素,不修改队头指针
if(Q.front!=Q.rear)              //队列非空
return Q.base[Q.front];      //返回队头元素的值,队头指针不变
}

void DancePartner(person dancer[],int num)
{//结构数组dancer中存放跳舞的男女,num是跳舞的人数
person p;
int i;
SqQueue Mdancers,Fdancers;
InitQueue(Mdancers);     //男士队列初始化
InitQueue(Fdancers);     //女士队列初始化
for (i=0;i<num;i++)      //根据性别依次将跳舞的人插入相应队列
{
p=dancer[i];
if (p.sex=='F')  EnQueue(Fdancers,p);    //插入男队
else EnQueue(Mdancers,p);               //插入女队
}
cout<<"The dancing partner are:\n";
while(!QueueEmpty(Fdancers)&&!QueueEmpty(Mdancers))
{//依次输出男女舞伴的姓名
DeQueue(Fdancers,p);     //女士出队
cout<<p.name<<" ";      //输出出队女士姓名
DeQueue(Mdancers,p);    //男士出队
cout<<p.name<<endl;     //输出出队男士姓名

}
if (!QueueEmpty(Fdancers))      //女士队非空,输出队头女士的姓名
{
p=GetHead(Fdancers);     // 取女队的头
cout<<p.name<<" is waiting for a partner."<<endl;
}
else if (!QueueEmpty(Mdancers))    //男士队非空,输出男士队头的姓名
{
p=GetHead(Mdancers);     // 取男队的头
cout<<p.name<<" is waiting for a partner."<<endl;
}

}

int main()
{
int i,j;
person dancer[QueueSize];
cout<<"请输入跳舞的人数:";
cin>>j;
while(j<=0)
{
cout<<"输入错误,请重新输入跳舞的人数:";
cin>>j;
}
for(i=1;i<=j;i++)
{
cout<<"请输入第"<<i<<"舞者的名字:"<<endl;
cin>>dancer[i-1].name;
cout<<"请输入第"<<i<<"个人的性别(F/M):"<<endl;
cin>>dancer[i-1].sex;
while(dancer[i-1].sex!='F'&&dancer[i-1].sex!='M')
{
cout<<"*******输入错误,请重新输入:\n";
cout<<dancer[i-1].sex;
cout<<"请输入第"<<i<<"个人的性别(F/M):"<<endl;
cin>>dancer[i-1].sex;
break;
}
}
DancePartner(dancer,j);

}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: