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

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

课程名称:数据结构

实验目的:

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

 

转载于:https://www.cnblogs.com/xisheng/p/7823091.html

  • 7
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值