dhu 4.1 队列模板简单应用算法设计:士兵队列训练
队列模板简单应用算法设计:士兵队列训练
时间限制: 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 队列模板简单应用算法设计:士兵队列训练相关推荐
- 顺序队列模板简单应用算法设计:农夫过河(这个比较难,我自己都觉得难)
文章目录 问题描述 : 输入说明 : 输出说明 : 输入范例 : 输出范例 : 思路分析 伪码实现 事故现场 第一次提交 分析与总结 如有不妥,或者疑问,请加扣扣651378276,一起商议学习进步 ...
- 队列模板简单应用算法设计:士兵队列训练
问题描述 : 目的:使用C++模板设计队列(链队列和顺序队列)的抽象数据类型(ADT).并在此基础上,使用队列ADT的基本操作,设计并实现简单应用的算法设计. 内容:(1)请参照栈的ADT模板,设计队 ...
- HTML5期末大作业:花甲美食网站设计——精美花甲美食网页(8页) 海鲜网页制作作业 生鲜水果蔬菜网页设计模板 简单学生网页设计代做 静态HTML CSS网站制作成品
HTML5期末大作业:花甲美食网站设计--精美花甲美食网页(8页) 海鲜网页制作作业 生鲜水果蔬菜网页设计模板 简单学生网页设计代做 静态HTML CSS网站制作成品 常见网页设计作业题材有 个人. ...
- 网页设计作业花甲美食网站设计——精美花甲美食网页(8页) 海鲜网页制作作业 生鲜水果蔬菜网页设计模板 简单学生网页设计代做 静态HTML CSS网站制作成品
HTML5期末大作业:花甲美食网站设计--精美花甲美食网页(8页) 海鲜网页制作作业 生鲜水果蔬菜网页设计模板 简单学生网页设计代做 静态HTML CSS网站制作成品 常见网页设计 文章目录 HTML ...
- 简单排序算法设计(Java)
总共有八种排序算法,还是慢慢看吧 1.简单排序算法 简单排序算法就是设置标兵,逐个比较数,然后查找插入位置,插入 public static void p(int[] a){for(int i=0;i ...
- 队列的基本操作_算法设计:数据结构-队列
一.队列 1.队列的概念 队列是一种"先进先出(first in first out)"的数据结构,它是一种有序线性表的抽象数据类型.队列在计算机 领域的应用也相当的广泛,例如计算 ...
- 高仿英雄联盟游戏网页制作作业 英雄联盟LOL游戏HTML网页设计模板 简单学生网页设计 静态HTML CSS网站制作成品
- 宠物狗网页制作作业 保护动物网页设计模板 简单学生网页设计 静态HTML CSS网站制作成品
- 实现环形队列各种基本运算的算法
/** * 实现环形队列各种基本运算的算法 * 目的: * 领会环形队列存储结构和掌握环形队列中各种基本运算算法设计 * 主要功能: * 1.初始化队列q * ...
最新文章
- stmt在java中的应用_JDBC技术基础总结转载,非原创
- vs2003打开项目错误
- 这4部有生之年必看的“教材级”纪录片,免费领取!
- python如何读取kepsever_python linecache读取过程
- Apache重定向方法实现图片防盗链
- 资源放送丨《OGG日常运维及故障处理》PPT视频
- 鸿蒙第三代手机,荣耀Magic 3最新确认,鸿蒙系统+双6400万,最期待的荣耀来了
- 算法不会,尚能饭否之排序——冒泡排序(bubble sort)
- 常见基本题型:进制的转换
- JAVA开源商城系统
- c语言 最大子段和,C语言程序设计100例之(13):最大子段和
- 在Vue中使用highlight.js
- 高德地图正确食用方法(持续更新)
- 时尚【女连衣裙秋季新款连衣裙】搭配技巧
- 最简单的方式实现竖排文字显示
- 电脑同时连接有线和无线网络怎么设置有线网络优先
- Android下的特殊文件夹
- Java基础知识笔记-11_2-Swing用户界面组件
- 大数据必学Java基础(一):Java体系结构、特性和优势
- 如何将动态URL静态化!