实验项目三:队列的基本操作应用
课程名称:数据结构
实验目的:
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: "; 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<<"*******输入错误,请重新输入: "; cout<<dancer[i-1].sex; cout<<"请输入第"<<i<<"个人的性别(F/M):"<<endl; cin>>dancer[i-1].sex; break; } } DancePartner(dancer,j); }