问题描述 :

  • 目的:使用C++模板设计队列(链队列和顺序队列)的抽象数据类型(ADT)。并在此基础上,使用队列ADT的基本操作,设计并实现简单应用的算法设计。

  • 内容:(1)请参照栈的ADT模板,设计队列的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的栈ADT原型文件,自行设计队列的ADT。)

    • (2)ADT的简单应用:使用该ADT设计并实现若干应用队列的算法设计。
  • 应用:某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。

  • 要求设计一个算法,使用链队列或顺序队列(只能使用1个队列),设计并实现打印输出剩下的新兵最初的编号的算法。

  • 注意:本题允许有多个测试数据组,新兵总人数不超过5000。由于士兵可能的总人数较多,顺序队列需预先申请的存储空间较大,建议使用链队列。(样例程序使用的是链队列。)

参考函数原型:template<class ElemType>void queuetraining(SqQueue<ElemType> &S, int T); //T为测试数据的组数/* 链队列的结点定义 */template<class ElemType>struct LinkQueueNode{ElemType data;LinkQueueNode<ElemType> *next;LinkQueueNode(LinkQueueNode<ElemType> *ptr = NULL){next = ptr;} //构造函数1,用于构造头结点LinkQueueNode(const ElemType &item, LinkQueueNode<ElemType> *ptr = NULL) //构造函数2,用于构造其他结点   //函数参数表中的形参允许有默认值,但是带默认值的参数需要放后面{next = ptr;data = item;}ElemType getData(){ return data;}  //取得结点中的数据void SetLink( LinkQueueNode<ElemType> *link ){ next = link; }  //修改结点的next域 void SetData( ElemType value ){ data = value; }   //修改结点的data域};//带头结点的链队列 template<class ElemType>class LinkQueue{private:LinkQueueNode<ElemType> *front;   // 队头指针LinkQueueNode<ElemType> *rear;   // 队尾指针int length;   //队列当前元素个数 public://无参数的构造函数LinkQueue();//析构函数~LinkQueue(){LinkQueueDestroy();}//销毁链队列 bool LinkQueueDestroy();//清空链表bool LinkQueueClear(); //返回链队列的长度int QueueLength() const{ return length;}//判断链队列是否为空队列bool QueueisEmpty() const;//出队bool deQueue( ElemType &e );//入队bool enQueue( ElemType e );//获取链队列头结点指针 LinkQueueNode<ElemType>* GetFront() { return front;}//获取队头元素ElemType GetFrontData(){ return front->data;}      //获取链队列队尾指针LinkQueueNode<ElemType>* GetRear() { return rear;}//遍历链队列 bool QueueTraverse() const;};

输入说明 :

第一行:组数N,第二行-第N+1行:每组的新兵人数

输出说明 :

第一行:..      剩下的新兵最初的编号,编号之间有用","分隔。.

第N行:

输入范例 :

2
20
40

输出范例 :

1,7,19
1,19,37

思路分析

  • 过程演示
  • 使用队列实现
  • 先是模拟报数和出队,1至2报数,和1至3报数基本一致
  • 实现的总的过程
  • 两个注意事项

伪码实现

void queuetraining(LinkQueue<ElemType> &S, int T[],int len) {for(m = 0; m < len; m ++) {//生成队列的过程int edge = T[m];for(i = 1; i < edge +1 ; i ++) {S.enQueue(i);}//报数的过程start,temp,temp2;while(1) {start = S.GetFrontData();do {for( i = 1; i <= 2; i++) {S.deQueue(temp2);if(i == 1) S.enQueue(temp2);temp = S.GetFrontData();if(temp == start) break;}} while(temp != start);if(S.QueueLength() <= 3) break;start = S.GetFrontData();do {for(i = 1; i <= 3; i++) {S.deQueue(temp2);if(i != 3) S.enQueue(temp2);temp = S.GetFrontData();if(temp == start) break;}} while(temp != start);if(S.QueueLength() <= 3) break;}S.LinkQueueClear();}}

事故现场

算是第一个次提交

分析与总结

关于析构函数

  • 一定先判定是否有下一个结点,下一个结点的地址是否为空,再去进行相关的操作。
  • 其实我觉得上面写的太难懂了,读起来有点费劲,多一点变量也没事,更加便于理解。
关于构造函数

  • 千万别忘记将的链表的长度初始化,不然你会很费解,为什么会一直死循环。
关于整个函数的实现过程
  • 报数随时都可能结束,所以每报一个数字,都要进行判定,是不是要结束了

  • 完整的一轮报数结束之后,才需要进行判定人数是否不满足。

  • 我认为老师的给的参考函数模型有问题,我实现不了,只能修改一下

  • 我认为有很多重复过程,应该可以进行进一步的提炼,使得整个函数体不至于那么臃肿,但是我不知道怎么让函数返回break。

若有不妥,或者疑问之处,请加本人的扣扣651378276,一起商议学习,进步
白嫖我很不舒服,写了很久,麻烦转发扩一下

队列模板简单应用算法设计:士兵队列训练相关推荐

  1. dhu 4.1 队列模板简单应用算法设计:士兵队列训练

    队列模板简单应用算法设计:士兵队列训练 时间限制: 1S类别: DS:队列->队列定义及应用 晚于: 2022-05-04 23:55:00后提交分数乘系数50% 截止日期: 2022-05-0 ...

  2. 顺序队列模板简单应用算法设计:农夫过河(这个比较难,我自己都觉得难)

    文章目录 问题描述 : 输入说明 : 输出说明 : 输入范例 : 输出范例 : 思路分析 伪码实现 事故现场 第一次提交 分析与总结 如有不妥,或者疑问,请加扣扣651378276,一起商议学习进步 ...

  3. HTML5期末大作业:花甲美食网站设计——精美花甲美食网页(8页) 海鲜网页制作作业 生鲜水果蔬菜网页设计模板 简单学生网页设计代做 静态HTML CSS网站制作成品

    HTML5期末大作业:花甲美食网站设计--精美花甲美食网页(8页) 海鲜网页制作作业 生鲜水果蔬菜网页设计模板 简单学生网页设计代做 静态HTML CSS网站制作成品 常见网页设计作业题材有 个人. ...

  4. 网页设计作业花甲美食网站设计——精美花甲美食网页(8页) 海鲜网页制作作业 生鲜水果蔬菜网页设计模板 简单学生网页设计代做 静态HTML CSS网站制作成品

    HTML5期末大作业:花甲美食网站设计--精美花甲美食网页(8页) 海鲜网页制作作业 生鲜水果蔬菜网页设计模板 简单学生网页设计代做 静态HTML CSS网站制作成品 常见网页设计 文章目录 HTML ...

  5. 简单排序算法设计(Java)

    总共有八种排序算法,还是慢慢看吧 1.简单排序算法 简单排序算法就是设置标兵,逐个比较数,然后查找插入位置,插入 public static void p(int[] a){for(int i=0;i ...

  6. 队列的基本操作_算法设计:数据结构-队列

    一.队列 1.队列的概念 队列是一种"先进先出(first in first out)"的数据结构,它是一种有序线性表的抽象数据类型.队列在计算机 领域的应用也相当的广泛,例如计算 ...

  7. 高仿英雄联盟游戏网页制作作业 英雄联盟LOL游戏HTML网页设计模板 简单学生网页设计 静态HTML CSS网站制作成品

  8. 宠物狗网页制作作业 保护动物网页设计模板 简单学生网页设计 静态HTML CSS网站制作成品

  9. 实现环形队列各种基本运算的算法

    /** *   实现环形队列各种基本运算的算法 *   目的: *       领会环形队列存储结构和掌握环形队列中各种基本运算算法设计 *   主要功能: *       1.初始化队列q *   ...

最新文章

  1. Python使用matplotlib函数subplot可视化多个不同颜色的折线图、为多个子图添加总标题(main title)、自定义设置主标题字体类型、字体大小、字体颜色等
  2. python如何定义一个简单的队列
  3. The source attachment does not contain the source for the file Activity.class
  4. 算法学习:回文自动机
  5. React Native应用如何想访问HTTP资源应该怎么办
  6. linux 下 mysql默认表_linux环境下mysql默认是区分表名大小写的
  7. JAVA中pin什么意思_java语言中的多态概述
  8. 【渝粤题库】陕西师范大学202012 刑事诉讼法专论 作业
  9. Mybatis简单数据库查询
  10. \Process(sqlservr)\% Processor Time 计数器飙高
  11. 小米路由器4a刷第三方固件_小米路由器4A的断网问题初探
  12. Java网络编程之客户端中的Socket
  13. CSS3 transform 属性
  14. 通达信 移动平均算法_【股市钱包】A005号指标:通达信分时图MACD
  15. 搞定Prometheus普罗米修斯监控系统
  16. 页面添加蒙版,但是不影响页面其他事件响应
  17. 失效而后犬儒【2019.05.15报告记录】
  18. 移动互联网组建与优化
  19. Electron设置窗口图标、设置桌面快捷方式图标
  20. json发送数据加密方法_发送加密的电子邮件和安全邮件的最佳免费方法

热门文章

  1. 封装JS文件到DLL中并在页面中调用
  2. JSP连数据库登录检查用户名和密码模板
  3. 快速排序、归并排序、插入排序与基数排序
  4. ubuntu安装时间查询_ubuntu安装和查看已安装
  5. 安全性归约(安全性定义 - 2)
  6. 儿子的烦恼事-我爱我家
  7. 迪赛智慧数——折线图(动态折线图):2001- 2020中国城镇收入、房价、GDP、通货增长对比
  8. 直播软件开发IOS直播客户端SDK,视频直播APP源码【开源】
  9. 转:游戏玩家集体出逃 社交网站遭遇迷途
  10. 微信小程序学习笔记④——Flex布局[实战样例之画骰子]