数据结构课程设计选做(三)---公共钥匙盒(线性表,栈,队列)

2024-04-15 11:36

本文主要是介绍数据结构课程设计选做(三)---公共钥匙盒(线性表,栈,队列),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2.3.1 题目内容
2.3.1-A [问题描述]

有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家。每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥匙放回到钥匙盒中。

钥匙盒一共有N个挂钩,从左到右排成一排,用来挂N个教室的钥匙。一串钥匙没有固定的悬挂位置,但钥匙上有标识,所以老师们不会弄混钥匙。

每次取钥匙的时候,老师们都会找到自己所需要的钥匙将其取走,而不会移动其他钥匙。每次还钥匙的时候,还钥匙的老师会找到最左边的空的挂钩,将钥匙挂在这个挂钩上。如果有多位老师还钥匙,则他们按钥匙编号从小到大的顺序还。如果同一时刻既有老师还钥匙又有老师取钥匙,则老师们会先将钥匙全还回去再取出。

今天开始的时候钥匙是按编号从小到大的顺序放在钥匙盒里的。有K位老师要上课,给出每位老师所需要的钥匙、开始上课的时间和上课的时长,假设下课时间就是还钥匙时间,请问最终钥匙盒里面钥匙的顺序是怎样的?

2.3.1-B [基本要求]

(1)输入格式

输入的第一行包含两个整数N, K。

接下来K行,每行三个整数w, s, c,分别表示一位老师要使用的钥匙编号、开始

课的时间和上课的时长。可能有多位老师使用同一把钥匙,但是老师使用钥匙的时间

不会重叠。

保证输入数据满足输入格式,你不用检查数据合法性。

2)输出格式

输出一行,包含N个整数,相邻整数间用一个空格分隔,依次表示每个挂钩上挂的

钥匙编号。

样例输入

5 2

4 3 3

2 2 7

样例输出

1 4 3 2 5

样例说明

  第一位老师从时刻3开始使用4号教室的钥匙,使用3单位时间,所以在时刻6还钥匙。第二位老师从时刻2开始使用钥匙,使用7单位时间,所以在时刻9还钥匙。

  每个关键时刻后的钥匙状态如下(X表示空):

  时刻2后为1X345;

  时刻3后为1X3X5;

  时刻6后为143X5;

  时刻9后为14325。

课程设计要求:

(1)要求从文本文件中输入;

(2)根据时间进程,将取走钥匙和归还钥匙分别视为事件,放入队列中,然后通过每个事件的先后发生对钥匙盒的状态进行变更;

(3)严格按照要求的输入输出格式进行数据的输入、输出(训练CSP考试中的格式化输入输出的正确性);

(4)选做:通过图形界面来显示钥匙盒的即时状态,以及事件队列的状态。

2.3.2 算法思想

定义了一个结构体 Node,用于存储借还钥匙的信息,包括钥匙编号、时间和借还标识。

自定义了一个比较函数 cmp,用于对借还钥匙的信息进行排序。排序的规则是首先按时间早的优先,然后是还钥匙优先,最后是编号小的优先。从文件中读取钥匙盒大小 N 和操作次数 K。

初始化了一个数组 num,用于存储钥匙盒中的钥匙情况,下标表示钥匙位置,值表示钥匙编号。通过循环,读取每次操作的借还钥匙信息,并将这些信息存储在结构体数组 node 中,同时对应的操作次数进行递减。对存储的借还钥匙信息进行排序,排序规则使用了自定义的比较函数 cmp。遍历排序后的借还钥匙信息,根据借还标识将钥匙放入或取出钥匙盒中的对应位置。最后输出最终的钥匙盒情况。

2.3.3 源代码 [共87]
#include<iostream>
#include<algorithm>
#include<fstream>
using namespace std;int num[1005]; // 用于存储钥匙盒中的钥匙情况,下标表示钥匙位置,值表示钥匙编号struct Node
{int key; // 钥匙编号int time; // 时间int sign; // 借还标识,借为0,还为1
} node[20002]; // 存储借还钥匙的信息// 自定义比较函数,用于排序
bool cmp(Node a, Node b)
{if(a.time != b.time)return a.time < b.time; // 时间早的优先else{if(a.sign != b.sign) return a.sign > b.sign; // 还优先else return a.key < b.key; // 编号小优先}
}int main()
{ifstream a;a.open("data.txt",ios::in);if(a.eof()){cout<<"打开文件失败!"<<endl;a.close();exit(0);}int N, K;a>> N >> K; // 输入钥匙盒大小和操作次数for(int i = 1; i <= N; i++) num[i] = i; // 初始化钥匙盒int n = 0;while(K--){int w,s,c;//cin >> w >> s >> c; // 输入借还钥匙的信息a>>w>>s>>c;// 存储借钥匙的信息node[n].key = w;node[n].time = s;node[n++].sign = 0;//0代表借 // 存储还钥匙的信息node[n].key = w;node[n].time = s + c;node[n++].sign = 1;//1代表还 }sort(node, node + n, cmp); // 对借还钥匙的信息进行排序for(int i = 0; i < n; i++){if(node[i].sign){ // 还钥匙for(int j = 1; j <= N; j++){if(!num[j]){num[j] = node[i].key; // 找到空位,放入还的钥匙break;}    }   }else{ // 借钥匙for(int j = 1; j <= N; j++){if(num[j] == node[i].key)num[j] = 0; // 找到对应的钥匙,置为空位}   } }for(int i = 1; i <= N; i++)cout << num[i] << " "; // 输出最终的钥匙盒情况a.close();return 0;
}
2.3.4 测试数据与运行结果
2.3.4-A 测试数据

2.3.4-B 运行结果

源码地址:GeekclubC/Course-Design-of-Data-Structure: 用C++完成的数据结构课程设计 (github.com)

这篇关于数据结构课程设计选做(三)---公共钥匙盒(线性表,栈,队列)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/905708

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig