美文网首页
2022-04-14舞伴问题

2022-04-14舞伴问题

作者: 晨颜 | 来源:发表于2022-04-14 19:21 被阅读0次

    舞伴问题

    #include<iostream>
    #include<fstream>
    #include<string>
    #define MAXQSIZE 100//队列可能达到的最大长度
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    using namespace std;
    
     
    typedef struct {
        char name[20]; //姓名
        char sex; //性别,'F'表示女性,'M'表示男性
    } Person;
    typedef struct {
        Person *base; //队列中数据元素类型为Person
        int front; //头指针
        int rear; //尾指针
    } SqQueue; 
    Person dancer[MAXQSIZE];
    SqQueue Mdancers, Fdancers; //分别存放男士和女士入队者队列
    //循环队列的初始化
    int InitQueue(SqQueue &Q) {//构造一个空队列Q
        Q.base = new Person[MAXQSIZE]; //为队列分配空间
        if (!Q.base)
            exit( OVERFLOW); //存储分配失败
        Q.front = Q.rear = 0; //头指针和尾指针置为零,队列为空
        return OK;
    }
    //求循环队列的长度
    int QueueLength(SqQueue Q) {//返回Q的元素个数(队列的长度)
        return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
    }
    //循环队列的入队
    int 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 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]; //返回队头元素的值,队头指针不变
    }
    int QueueEmpty(SqQueue &Q) {
        if (Q.front==Q.rear) //队空
            return OK;
        else
            return ERROR;
    }
    //舞伴问题
    void DancePartner(Person dancer[], int num) { 
        InitQueue(Mdancers); //男士队列初始化
        InitQueue(Fdancers); //女士队列初始化
        Person p;
        for (int i=0;i<num;i++) //依次将跳舞者根据其性别入队
        {
            p=dancer[i];
            if (p.sex=='F')
                EnQueue(Fdancers,p); //插入女队
            else
                EnQueue(Mdancers,p); //插入男队
        }
        cout<<"The dancing partners are:"<< endl;
        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 << "The first man to get a partner is: " << endl;
            cout << p.name << endl;
        } else if (!QueueEmpty(Mdancers)) { //男士队列非空,输出队头男士的姓名
            p = GetHead(Mdancers);          //取男士队头
            cout << "The first woman to get a partner is: " << p.name << endl;
        }
    }
    void CreatPerson(Person dancer[],int n) //根据指定个数,逐个输入;
    {
        int i;
        for(i=0;i<n;i++) {
            //p = dancer[i];
            cout<<"------"<<"请输入第"<<i+1<<"个舞者:";
            cin>> dancer[i].name>>dancer[i].sex;
        }
        /*
        cout<<"------"<<"请输入"<<n<<"个舞者:\n";
        for(i=0;i<n;i++) {      
            cin >>dancer[i].name>>dancer[i].sex;
        }*/
    }
    
    
    int main() {
        int a = 0;
        cout<<"请输入人数";
        cin>>a;
        CreatPerson(dancer,a); //OutputList(dancer,a);
        DancePartner(dancer, a);
        return 0;
    }
    void OutputList(Person dancer[],int n)//逐个显示所舞者信息; 
    {
        int i;
        for(i=0;i<n;i++) {
            cout<<"------"<<"第"<<i+1<<"个舞者:";
            cout<<dancer[i].name<<"\t"<<dancer[i].sex<<endl;
        }
    } 
    

    测试数据
    刘一 F
    陈二 M
    张三 M
    李四 F
    王五 M
    赵六 F
    孙七 F
    周八 F
    吴九 M
    郑十 F
    江十一 F

    相关文章

      网友评论

          本文标题:2022-04-14舞伴问题

          本文链接:https://www.haomeiwen.com/subject/hmcxertx.html