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


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

    课程名称:数据结构

    实验目的:

    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);
         
          
     }
     
     
     
     
     
     
     
  • 相关阅读:
    数字游戏(划分型)
    统计单词个数(划分型)
    数的划分(划分型)
    乘积最大(划分型)
    codevs 3152 装箱问题3
    洛谷 p2530 化工场装箱员(资源型)
    金明的预算方案(分组背包)
    洛谷 p2066 机器分配(资源型)
    上升子序列问题
    网络流
  • 原文地址:https://www.cnblogs.com/xisheng/p/7823091.html
Copyright © 2020-2023  润新知