《数据结构》实验报告-实验二 栈与队列的应用

news2024/11/16 11:46:49

《数据结构》实验报告-实验二 栈与队列的应用

一、问题分析

(1)实验1中,火车进站和出站的过程,与后进先出的数据结构栈很相似。因为火车只能单方向进出站,前面进来的火车反而要等后面的火车先出站,这也导致火车出站的序列需要满足一定的条件。问题中给出进站和出站的序列,在计算机中可以用进栈和退栈模拟出来,如果最后不能按所给的出站序列退栈,则输出不可行。所以实验1是围绕栈展开讨论的,需要完成初始化栈,进栈,弹栈,获取栈顶元素,判断栈空等基本操作。
(2)实验2中,火车进站的顺序是乱序排列的,而要求出站的序列为升序,即序号小的永远要比序号大的先出站,这时就需要先进站的大序号火车在缓冲轨道上排队,等待小序号火车优先通过。而对于每条轨道,先进站的火车要比后进站的火车先出站,满足先进先出的队列结构。所以每条轨道上的火车从前往后序号是递增的。实质上就是求入栈序列中最长下降子序列长度。我们需要为每条缓冲轨道都设置一个队列,进行队列中队尾元素的比较,来确定后进来的火车到底从哪条缓冲轨道上驶入(入队操作)。所以实验2围绕队列展开,需要初始化队列,入队,获取队尾等操作。

二、详细设计

2.1设计思想
(1)实验1的实现需要用到栈,算法设计时用栈去模拟火车进站和出站的序列。首先使用两个数组in和out来保存进站与出站序列,再用inNum和outNum分别记录当前要进站的火车序号和当前要出站火车序号。当序号为inNum的火车进站时,先检查是否与序号为outNum的火车相同,如果相同就直接让outNum增一,表示这辆火车刚进站就马上出站了,甚至不用进栈保存;否则就要先进栈保存,因为这辆火车还未到出站时候。每次循环都检查栈顶火车序号与outNum的火车序号是否相同,如果相同就退栈(出站),直到不同为止。出站序列不可行的情况是当进入最后一辆火车并且执行完上述操作后,栈不为空(说明火车无法按照此序列出站),则输出不可行。
(2)实验2则需要使用队列数组来记录缓冲轨道的火车进站情况。而对于每一条轨道上的火车,排在后面的火车必须比它前面的火车序号要大,否则不能满足升序出站的条件。所以每次有火车进站时,先找到第一个队尾火车序号小于当前进站火车序号的轨道编号(队列数组下标),将该火车入队。如果找不到,这说明需要另开设一条轨道放置这列火车。这样的进站规定可以使得队列数组呈现两种有序性:
①队列内从队头到队尾的火车序号为升序
②队列数组的队尾元素相对于队列数组下标为降序
两个有序性使得我们可以用二分答案来寻找最优的轨道放置火车,将原来
O(n)的时间复杂度压缩到O(log2n)。最后输出已使用的轨道数即为所求。
2.2 存储结构及操作
2.2.1存储结构
2.2.1.1 实验1
栈的节点结构体sNode,包含:
(1)一个int类型变量id,表示火车的序号
(2)一个sNode类型的指针next,指向它在栈中的下个节点
自定义链栈的结构体Stack,包含:
(1)一个sNode类型的指针top,指向栈顶节点
(2)一个int类型变量size,表示栈已存的节点数
2.2.1.2 实验2
队列的节点结构体qNode,包含:
(1)一个int类型变量id,表示火车的序号
(2)一个qNode类型指针next,指向它在队列中的下个节点
自定义队列的结构体Queue,包含:
(1)一个qNode类型的指针front,指向队列的队头
(3)一个qNode类型的指针rear,指向队列的末尾
(2)一个int类型变量size,表示队列已存的节点数

2.2.2 涉及的操作
(1)实验1中的栈相关函数,如表1所示。
表1

(2)实验2中的队列相关函数,如表2所示。
在这里插入图片描述

在这里插入图片描述

2.3 程序整体流程
(1)实验整体流程图如图1所示。

在这里插入图片描述

图 1
(2)实验1关键算法流程图,如图2所示。
在这里插入图片描述

图 2
(3)实验2关键算法流程图,如图3所示。
在这里插入图片描述

图 3

三、用户手册

程序接收数据的方式是从一个名为“Train.in”文件中读入。输入格式为先输入一个数n,表示总共要进站的火车数。然后有两行输入:第一行有n个数,在实验1中表示火车进站序列,在实验2中是无用数据(可以输入任意n个数);第二行有n个数,在实验1中表示要判断是否火车的出站序列,在实验2中表示火车的乱序进站序列。当输入的数据中包含非法字符时,会显示:
The input data is illegal,please input again:
当获取到所有正确输入时,程序会输出当前的情况数(作为间隔符),若为第一次执行,输出如下:
Case 1
程序会先进行出站序列的可行性判断。如果火车可以按照该出站序列出站,则程序会输出:
Experiment 1 :Judge Possibility:
The output train sequence is Possible
否则,程序会输出相反的结果:
Experiment 1 :Judge Possibility:
The output train sequence is impossible
判断结束后,程序会计算火车以此乱序进站序列并按升序出站所需最少缓冲轨道,如果这个轨道数为1,计算结束后会输出:
Experiment 2:Get MinBuffer:
The recover the order,1 buffer queue is needed
至此完整的执行了一次情况,当仍有输入时情况数会增一,直到读到文件末尾才会终止程序。

四、结果

(1)“Train.in”文件内的测试数据,如图4和图5所示。
在这里插入图片描述

图 4
在这里插入图片描述

图 5
(2)程序运行截图,如图6和图7所示。

图 6 在这里插入图片描述
图 7在这里插入图片描述

五、总结

本次实验中主要用到了栈和队列这两种极其重要的数据结构。对于栈,主要用到的操作有初始化链栈,压栈,弹栈,取栈顶和判断栈空;对于队列,主要的操作有初始化队列,入队,出队,返回队尾和判断队空。在实现数据结构的基本操作的基础上,把实际的问题转化为对栈和队列的操作上。在实验1中,火车进出站的过程在栈中得到很好地模拟,利用栈的特性就可以很轻松的判断给出的出站序列是否可行;在实验2中,更多的利用了队列先进先出的思想,而不是简单的模拟。特别在寻找最佳轨道入队时,运用到的其实是利用队列数组队尾元素的有序性,进行二分答案找到最佳轨道。
然而在实验2中,存在许多明显的问题。比如在初始化队列数组时,将火车总数个队列进行了初始化,这在火车总数较大的时候会造成巨大的空间开销,且大多数时候都是用不完的,利用率较低。但是其实我们并不需要用一个队列数组来存储火车序列。因为我们对于每条轨道上的火车,只关心它最末尾那辆火车的序号大小,在程序中也完全没有用到出队和取队头元素的操作。所以我们可以用一个普通的数组来存储各轨道的队尾火车序号,在二分答案时找到最佳轨道时,只需替代掉对应数组下标的数即可,表示该火车驶入了该轨道。这样不仅大大降低了空间复杂度,而且也不需要进行各种队列操作,简化了操作。这其实是建立在队列思想基础上的优化。
通过本次实验,我巩固了进行栈和队列的基本操作的能力,在思考问题时代入特定的数据结构,构建了解题的框架,编写时几乎没出现什么bug。在实验2中,我对老师给出的模板效率提出了自己的见解,培养了独立思考的能力。在完成实验报告的过程中,逐渐规范文章格式,为各个图片和表格插入题注,对字体和大小严格要求,并培养了良好的流程图作图习惯。相信通过本次实验,我可以为未来的学习打下更坚实的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1390842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MongoDB面试系列-01

1. MongoDB 是什么? MongoDB是由C语言编写的,是一个基于分布式文件存储的开源数据库系统。再高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB旨在给Web应用提供可扩展的高性能数据存储解决方案。 MongoDB将数据存储…

php网站上传文件失败File upload failed(文件大小超过限制)

php项目中,用户上传文件报错:“File upload failed”,按如下代码输出文件名: $temp_name $_FILES[file][tmp_name]; $file_name basename($_FILES[file][name]);echo "Temporary File Name: " . $temp_name . "…

软件设计师3--CPU组成(运算器与控制器)

软件设计师3--CPU组成(运算器与控制器) 考点1:计算机结构考点2:CPU结构CPU包括运算器和控制器例题: 考点1:计算机结构 考点2:CPU结构 CPU包括运算器和控制器 运算器: 算数逻辑运算…

Git 使用与问题记录 二(公司快速上手版)

写在前面 记录自己学习的内容,方便后面忘记的时候查看。给像我一样的新手提供一点参考 正文 上一章已经安装好了Git,如何使用呢。我这里会分享两种办法,第一种是在VS2022中克隆代码,修改和提交;第二种是用命令提交。…

决战排序之巅(二)

决战排序之巅(二) 排序测试函数 void verify(int* arr, int n) 归并排序递归方案代码可行性测试 非递归方案代码可行性测试 特点分析 计数排序代码实现代码可行性测试 特点分析 归并排序 VS 计数排序(Release版本)说明1w rand( ) …

Ubuntu20.4 Mono C# gtk 编程习练笔记(一)

简言 Mono是Linux环境下C#的开发、编译及运行环境。gtk是gnome独具特色的图形库,Mono对它进行了C#封装。Linux环境下,许多的编程语言使用gtk界面库,有比较好的编程群众基础。另外,Mono相对于DOTNET来说要轻量许多,它们…

uniapp 使用canvas制作柱状图

效果图: 实现思路: 1、通过展示数据计算需要画几根柱子; 2、通过组件宽度、高度计算出每根柱子的宽度及高度; 3、for循环依次绘制每根柱子; 4、绘制柱子时,先绘制顶部百分比、value值,再绘制柱…

Grafana(二)Grafana 两种数据源图表展示(json-api与数据库)

一. 背景介绍 在先前的博客文章中,我们搭建了Grafana ,它是一个开源的度量分析和可视化工具,可以通过将采集的数据分析、查询,然后进行可视化的展示,接下来我们重点介绍如何使用它来进行数据渲染图表展示 Docker安装G…

跟着pink老师前端入门教程-day03

6. 表格标签 6.1 表格的主要作用 主要用于显示、展示数据&#xff0c;可以让数据显示的规整&#xff0c;可读性非常好&#xff0c;特别是后台展示数据时&#xff0c;能够熟练运用表格就显得很重要。 6.2 基本语法 <!--1. <table> </table> 是用于定义表格的标…

MySQL的内部XA的二阶段提交

内部XA 可能大家一听感觉很陌生&#xff0c;什么是XA&#xff1f;XA是一种分布式事务管理规范&#xff0c;MySQL内部有一个XA事务管理器来支持分布式事务&#xff0c;可能这么一听更懵了&#xff0c;那么我这么解释一下&#xff0c;MySQL是支持主从的&#xff0c;主从分布在不…

导入失败,报错:“too many filtered rows xxx, “ErrorURL“:“

一、问题&#xff1a; 注&#xff1a;前面能正常写入&#xff0c;突然就报错&#xff0c;导入失败&#xff0c;报错&#xff1a;“too many filtered rows xxx, "ErrorURL":" {"TxnId":769494,"Label":"datax_doris_writer_bf176078-…

预处理/预编译详解(C/C++)

在上一篇的bolg中的编译与链接中提到过预处理&#xff0c;但只是较为简单的讲解&#xff0c;本篇将会对预处理进行详细的讲解。 其中在预处理中很重要的一个一个知识点是#define定义常量与宏&#xff0c;还区分了宏与函数的区别&#xff0c;以及#和##符号&#xff0c;还涉及条件…

【Java SE】类和对象详解

文章目录 1.什么是面向对象2. 类的定义和使用2.1 简单认识类2.2 类的定义格式 3. 类的实例化3.1 什么是实例化3.1.1 练习&#xff08;定义一学生类&#xff09; 3.2 类和对象的说明 4. this 引用5. 构造方法6. 对象的初始化6.1 默认初始化6.2 就地初始化 7. 封装7.1 封装的概念…

Angular系列教程之单向绑定与双向绑定

文章目录 介绍单向绑定双向绑定在自定义组件中实现双向绑定属性总结 介绍 在Angular开发中&#xff0c;数据的绑定是非常重要的概念。它允许我们将应用程序的数据与用户界面进行交互&#xff0c;实现数据的动态更新。在本文中&#xff0c;我们将探讨Angular中的两种数据绑定方…

学习k8s的应用(三)

一、k8s部署ngnix 1、一些查看命令 1-1、所有命令空间 kubectl get pod --all-namespaces kubectl get svc --all-namespaces1-2、指定命令空间 kubectl get pod -n yabin kubectl get svc -n yabin2、单节点集群兼容 # 因为目前只有一个master节点&#xff0c;默认安装后…

workflow源码解析:ThreadTask

1、使用程序&#xff0c;一个简单的加法运算程序 #include <iostream> #include <workflow/WFTaskFactory.h> #include <errno.h>// 直接定义thread_task三要素 // 一个典型的后端程序由三个部分组成&#xff0c;并且完全独立开发。即&#xff1a;程序协议算…

解决C语言wprintf函数无法打印中文的问题

在Visual Studio中&#xff0c;wchar_t[]字符数组用来存储UTF-16编码的字符串&#xff0c;但C语言库函数wprintf无法打印含有汉字的wchar_t字符串。 解决办法是用WriteConsoleW函数重新实现一个自己的my_wprintf函数。 #include <stdio.h> #include <Windows.h>//…

PDF文件中字体乱码的一种简单的处理方法

要解决问题先得碰到问题&#xff0c;碰到问题就迈出了解决问题的关键一步。 问题PDF文件的下载链接 这文件用Acrobat打开&#xff0c;无法搜索文本&#xff0c;复制文本出来也都是乱码。但用sumatra PDF打开就不存在这个问题&#xff01; 用Acrobat的印前检查解决。prefligh…

Python网络爬虫进阶:自动切换HTTP代理IP的应用

前言 当你决定做一个网络爬虫的时候&#xff0c;就意味着你要面对一个很大的挑战——IP池和中间件。这两个东西听起来很大上&#xff0c;但其实就是为了让你的爬虫不被封杀了。下面我就来给你讲讲如何搞定这些东西。 第一步&#xff1a;创建爬虫IP池的详细过程 首先&#xf…

电商数据分析--常见的数据采集工具及方法

数据采集|数据运营和数据分析 走进数据&#xff0c;一起学习数据处理&#xff0c;数据分析&#xff0c;数据挖掘&#xff0c;一起成长&#xff0c;相信通过一起努力&#xff0c;未来2-3年我们都会成为公司的中流砥柱。懂数据&#xff0c;会分析&#xff0c;会挖掘&#xff0c;…