zoukankan      html  css  js  c++  java
  • 队列的学习

    吉首大学 软件学院

    《数据结构与算法》实验报告

    实验名称

    (循环队列)的基本操作及应用

    实验地点

    3318

    指导老师

    ***

    实验时间

    2018.11.03

    提交时间

    2018.11.03

    班  级

    ********

    姓  名

    **

    学  号

    ********

     

    一、    实验目的

    (1)  掌握队列存储结构的表示和实现方法; 

    (2)  掌握队列的入队和出对等基本操作的算法实现;

    (3)  了解队列在实际问题中的简单应用

    二、    实验内容

    1. 问题描述: 某班有w个女生,有m个男生(w不等于m),现要开一个舞会。男女生分别编号坐在舞池的两边的椅子上。每一首舞曲开始时,一次从男生和女生中各出一人配对进入舞池跳舞,舞池允许进入的人数为k对学生(假设k的值小于w与m的值)。本曲没有成功配对者坐等下一曲找舞伴。请实际一个系统动态的现实出上述过程(本曲跳完之后,跳舞的学生走出外出重新排在原来队伍的尾部,其顺序和原来的顺序相同)。

    2. 基本要求:输出第k首舞曲配对情况。

    三、    实验原理及结果

    #include <iostream>

    #include <cstring>

    #include <cstdio>

    #include <cstdlib>

     

    using namespace std;

     

    typedef struct {

        char name[20];

        char gender;

    }person, ElemType;

     

    typedef struct QNode{

        ElemType date;

        struct QNode *next;

    }QNode, *QNodePtr;

     

    typedef struct {

        QNodePtr front;                 //队头指针

        QNodePtr rear;                  //队尾指针

    }LinkQueue;

     

    //创建队列

    bool InitQueue(LinkQueue &Q){

        Q.front = Q.rear = new QNode;          //队头队尾指针都指向新建队列

        if(Q.front == NULL || Q.rear == NULL){

            return false;

        }

        Q.front->next = NULL;

        return true;

    }

     

    //销毁队列

    bool DestroyQueue(LinkQueue Q){

        QNode* p = new QNode;

        while(Q.front != Q.rear){

            p = Q.front;

            Q.front = Q.front->next;

            delete p;

        }

        return true;

    }

     

    //返回队列的长度

    int QueueLenth(LinkQueue Q){

        QNode* p = new QNode;

        p = Q.front;

        int lenth = 0;

        while(p != Q.rear){

            lenth++;

            p = p->next;

        }

    }

     

    //往队尾添加元素e

    bool EnQueue(LinkQueue &Q, ElemType e){

        QNode *p = new QNode;

        p->next = NULL;

        p->date = e;

        Q.rear->next = p;

        Q.rear = p;

        return true;

    }

     

    //删除队头元素,并且返回元素e

    bool DeQueue(LinkQueue &Q, ElemType e){

        e = Q.front->next->date;

        Q.front = Q.front->next->next;

        return true;

    }

     

    //遍历队列

    void QueueTraverse(LinkQueue Q){

        QNode* p = new QNode;

        p = Q.front;

        while(p != Q.rear){

            p = p->next;

            cout << p->date.name << " " << p->date.gender << endl;

        }

    }

     

    //遍历队列第k个位置

    bool QueueTraverse(LinkQueue Q, int k){

        QNode* p = new QNode;

        p = Q.front;

        int lenth = 0;

        while(p != Q.rear){

            lenth++;

            p = p->next;

            if(lenth == k){

                cout << p->date.name << " " << p->date.gender << endl;

            }

        }

    }

     

    //返回某个位置元素的结点

    QNode* FindIndexNode(LinkQueue Q, int k){

        QNode* p = new QNode;

        p = Q.front;

        int lenth = 0;

        while(p != Q.rear){

            lenth++;

            p = p->next;

            if(lenth == k){

                return p;

            }

        }

    }

     

    //有某个结点演变而来的链接

    void ChangeQueue(LinkQueue &Q, int k){

        QNode * p = FindIndexNode(Q, k);

        Q.rear->next = Q.front->next;

        Q.front->next = p->next;

        Q.rear = p;

        p->next  = NULL;

    }

     

    int main(){

        //声明两个队列并且初始化队列

        LinkQueue MQ;

        LinkQueue FQ;

        InitQueue(MQ);

        InitQueue(FQ);

     

        //输入数据

        cout << "请输入参加舞会的人员名单(姓名性别(F M), Nobady结束" << endl;

        ElemType Elem;

        char DancerName[20];

        char sex;

        while(1){

            scanf("%s", DancerName);

            if(strcmp(DancerName, "Nobady") == 0){

                break;

            }

            strcpy(Elem.name, DancerName);

            scanf("%s", &Elem.gender);

     

            //根据性别的不同,分别加入两个队列

            if(Elem.gender == 'F'){

                EnQueue(FQ, Elem);

            }

            else if(Elem.gender == 'M'){

                EnQueue(MQ, Elem);

            }

        }

     

        cout << "女队的列表信息:" << endl;

        QueueTraverse(FQ);

        cout << "男队的列表信息:" << endl;

        QueueTraverse(MQ);

     

        int count = 0;

        cout << "输入舞池每次允许进入的对数" << endl;

        cin >> count;

     

        int index = 0, countTemp = count;

        while(countTemp --){

            ChangeQueue(FQ, count);

            ChangeQueue(MQ, count);

        }

     

        cout << "进行" << count << "回合后,舞池中的搭档:" << endl;

        while(index++ < count){

            cout  << "" << index << "对舞伴:" << endl;

            QueueTraverse(FQ, index);

            QueueTraverse(MQ, index);

        }

        system("pause");

    }

    /*

    wakaka F

    xiaoxi M

    lualux F

    afafga M

    fagafa F

    Nobady

    */

    四、    实验心得

        队列和栈这两种数据结构类型都是比较常用的,栈是先进后出型,队列是先进先出行,应对不同的问题,选择合适的是数据结构去解决问题,达到最简单的解决问题。队列有顺序和链式两种,一般的顺序队列由于存在“假溢出”现象引入了循环顺序队列,此处我用的是单链表循环队列解决的问题,不用在意到底有多少人加入舞会,方便进出,并且在输出第k次舞伴配对问题上,运用自己已有的知识,实现了每一次舞伴的整体进出,不把一对舞伴当做一个元素,而把一次舞伴配对当做一个元素去解决问题。达到了自定义数据结构的要求。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    区间DP中的环形DP
    hdu 5251 包围点集最小矩形 ***
    hdu 4858 水题
    hdu 3530 单调队列 **
    hdu 3338 最大流 ****
    hdu 2732 最大流 **
    hdu 5233 离散化 **
    hdu 3555 数位dp *
    zoj 3469 区间dp **
    2015 安徽程序设计省赛总结
  • 原文地址:https://www.cnblogs.com/854594834-YT/p/9894300.html
Copyright © 2011-2022 走看看