队列模板简单应用算法设计:士兵队列训练
时间限制: 1S类别: DS:队列->队列定义及应用

晚于: 2022-05-04 23:55:00后提交分数乘系数50%

截止日期: 2022-05-08 23:55:00

问题描述 :

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

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

(2)ADT的简单应用:使用该ADT设计并实现若干应用队列的算法设计。

应用:某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。

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

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

参考函数原型:

template

void queuetraining(SqQueue &S, int T); //T为测试数据的组数

/* 链队列的结点定义 */

template

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 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(){ if(front->next) return front->next->data;}      //获取链队列队尾指针LinkQueueNode<ElemType>* GetRear() { return rear;}//遍历链队列 bool QueueTraverse() const;

};

输入说明 :

第一行:组数N,

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

输出说明 :

第一行:

.

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

.

第N行:

输入范例 :

2
20
40
输出范例 :

1,7,19
1,19,37

这题目要求不清不楚的 改了好几次才知道它是咋排的

#include <iostream>
#include <cstring>
#include <string>
using namespace std;
#define Status int
typedef int QElemType;
//队列的顺序存储结构
#define MAXQSIZE 100       //队列可能达到的最大长度
typedef struct QNode       //结点定义
{QElemType data;struct QNode* next;
}QNode, * QueuePtr;
typedef struct             //队列定义
{QueuePtr front;        //队头指针QueuePtr rear;         //队尾指针
}LinkQueue;
Status InitQueue(LinkQueue& Q)
{//构造一个空队列QQ.front = Q.rear = new QNode;      //生成新结点作为头结点,队头和队尾指针指向此节点Q.front->next = NULL;            //头结点的指针域置空return 1;
}
Status EnQueue(LinkQueue& Q, QElemType e)
{//插入元素e作为Q的新队尾元素QNode* p = new QNode;         //分配空间p->data = e;                  //赋值p->next = NULL;Q.rear->next = p;             //插入队列Q.rear = p;                   //修改队尾指针return 1;
}
Status DeQueue(LinkQueue& Q, QElemType &e)
{//删除Q队头元素并用e返回其值if (Q.front == Q.rear)return 0;                 //判断队空QNode* p = Q.front->next;     //p指向队头元素e = p->data;                  //用e保存队头元素值Q.front->next = p->next;      //出队if (Q.rear == p)              //如果出队后空队,队尾指针指向头结点Q.rear = Q.front;delete p;                     //释放空间return 1;
}
QElemType GetHead(LinkQueue Q)
{//返回Q的队头元素,不修改头指针if (Q.rear != Q.front)                      //判断队空return Q.front->next->data;                     //返回队头元素值
}
typedef struct
{QElemType* base;      //存储空间的基地址int front;            //头指针int rear;             //尾指针
}SqQueue;
Status InitQueue(SqQueue& Q)
{//构建一个空队列QQ.base = new QElemType[MAXQSIZE];   //为队列分配一个最大容量为MAXQSIZE的数组空间Q.front = Q.rear = 0;              //头指针和尾指针置为0,队列为空return 1;
}
int QueueLength(SqQueue Q)
{return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}
Status EnQueue(SqQueue& Q, QElemType e)
{//插入元素e为Q的新的队尾元素if ((Q.rear + 1) % MAXQSIZE == Q.front)   //判断是否队满return 0;Q.base[Q.rear] = e;                       //插入元素Q.rear = (Q.rear + 1) % MAXQSIZE;         //队尾指针加1return 1;
}
Status DeQueue(SqQueue& Q, QElemType& e)
{//删除Q的队头元素,用e返回其值if (Q.rear == Q.front)                      //判断队空return 0;e = Q.base[Q.front];Q.front = (Q.front + 1) % MAXQSIZE;         //队头指针加1return 1;
}
QElemType GetHead(SqQueue Q)
{//返回Q的队头元素,不修改头指针if (Q.rear != Q.front)                      //判断队空return Q.base[Q.front];                     //返回队头元素值
}
QElemType GetTail(SqQueue Q)
{//返回Q的队尾元素,不修改头指针if (Q.rear != Q.front)                      //判断队空return Q.base[Q.rear - 1];                     //返回队尾元素值
}
void queuetraining(LinkQueue& S, int T) //T 为测试数据的组数
{int x = 0, ok = 1, y = 0,p=T;while (S.front->next->next->next != 0){        if (S.front->next->data == 1){if (ok == 0){ok = 1;if (S.front->next->next->next->next == 0)break;}else{ok = 0;if (S.front->next->next->next->next == 0)break;}x = 0;}x++;if (x == 2 && ok == 0){x = 0; DeQueue(S, y);continue;}else if (x == 3 && ok == 1){x = 0; DeQueue(S, y);continue;}else{DeQueue(S, y);EnQueue(S, y);}}while (S.front->next->data!=1){DeQueue(S, y);EnQueue(S, y);}if (S.front->next->next->next == 0)cout << S.front->next->data << "," << S.front->next->next->data;else if (S.front->next->next == 0)cout << S.front->next->data;else if (S.front->next->next->next->next == 0)cout << S.front->next->data << "," << S.front->next->next->data << "," << S.front->next->next->next->data;elsereturn;return;
}
int main()
{int n, m;cin >> n ;int N = n, i = 1;while (N--) {cin >> n;m = n;LinkQueue S;InitQueue(S);i = 1;while (n--){EnQueue(S, i);i++;}queuetraining(S, m);cout << endl;}return 0;
}

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

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

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

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

    问题描述 : 目的:使用C++模板设计队列(链队列和顺序队列)的抽象数据类型(ADT).并在此基础上,使用队列ADT的基本操作,设计并实现简单应用的算法设计. 内容:(1)请参照栈的ADT模板,设计队 ...

  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. stmt在java中的应用_JDBC技术基础总结转载,非原创
  2. vs2003打开项目错误
  3. 这4部有生之年必看的“教材级”纪录片,免费领取!
  4. python如何读取kepsever_python linecache读取过程
  5. Apache重定向方法实现图片防盗链
  6. 资源放送丨《OGG日常运维及故障处理》PPT视频
  7. 鸿蒙第三代手机,荣耀Magic 3最新确认,鸿蒙系统+双6400万,最期待的荣耀来了
  8. 算法不会,尚能饭否之排序——冒泡排序(bubble sort)
  9. 常见基本题型:进制的转换
  10. JAVA开源商城系统
  11. c语言 最大子段和,C语言程序设计100例之(13):最大子段和
  12. 在Vue中使用highlight.js
  13. 高德地图正确食用方法(持续更新)
  14. 时尚【女连衣裙秋季新款连衣裙】搭配技巧
  15. 最简单的方式实现竖排文字显示
  16. 电脑同时连接有线和无线网络怎么设置有线网络优先
  17. Android下的特殊文件夹
  18. Java基础知识笔记-11_2-Swing用户界面组件
  19. 大数据必学Java基础(一):Java体系结构、特性和优势
  20. 如何将动态URL静态化!

热门文章

  1. 打破设备和局域网的限制,爱奇艺万能联播-上线云投屏
  2. accountmanager 调用说明
  3. kettle简介及下载
  4. typeScript学习(二)
  5. 2022年焊工(初级)上岗证题目及模拟考试
  6. Android之通过向WebService服务器发送XML数据获取相关服务
  7. JSP招标投标管理系统JSP企业招标管理系统JSP网上招标管理系统JSP招标系统JSP投标系统
  8. android 获取apk资源,【Android开发】获取已安装应用的安装文件(apk文件)
  9. 自定义设置电脑屏保(.scr文件)
  10. 运营商设备常见维护命令,阿尔卡特朗讯7750