东北大学数据结构实验报告终审稿.docx
- 文档编号:24534326
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:17
- 大小:135.12KB
东北大学数据结构实验报告终审稿.docx
《东北大学数据结构实验报告终审稿.docx》由会员分享,可在线阅读,更多相关《东北大学数据结构实验报告终审稿.docx(17页珍藏版)》请在冰豆网上搜索。
东北大学数据结构实验报告终审稿
公司内部档案编码:
[OPPTR-OPPT28-OPPTL98-OPPNN08]
东北大学数据结构实验报告
实验报告
课程名称:
数据结构
班级:
实验成绩:
实验名称:
顺序表和链表的应用
学号:
批阅教师签字:
实验编号:
实验一
姓名:
实验日期:
2017-11-25
指导教师:
组号:
实验时间:
18:
30~22:
30
一、实验目的
(1)掌握线性表的基本操作(插入、删除、查找)以及线性表合并等运算在顺序存储结构、链式存储结构上的实现。
重点掌握链式存储结构实现的各种操作。
(2)掌握线性表的链式存储结构的应用。
二、实验内容与实验步骤
(1)实验内容:
实现约瑟夫环,约瑟夫环(Joseph)问题的一种描述是:
编号为1、2、3……n的n个人按照顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数的上限值m,从第一个人开始按照顺时针的方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
设计一个程序求出出列顺序。
(2)抽象数据类型和设计的函数描述,说明解决设想。
首先定义一个链表,用其中的data项存储每个人的编号,用password项存储每个人所持有的密码,并且声明一个指针。
之后使用CreatList_CL函数来创建一个循环链表,在其中的data和password中存入编号和密码,最后使最后一个节点的next指向L,使其能够形成循环队列。
定义了函数Display来显示链表当中的内容,以确定存储的数据没有错误。
定义了函数Delete_L来实现约瑟夫环中依次删除的功能,依次比较,如果某个人所持的密码和m值相等,则删除这个结点,并且输出此时该结点的编号和密码,实现出列的功能。
(3)简短明确地写出实验所采用的存储结构,并加以说明。
该实验我主要采用的是线性表的链式存储结构,首先定义了链表的结构,其中包括data项和password项,分别存储每个人的编号和所持密码,还声明了指向下一个结点的指针,该指针可以连接各个结点,并且将最后一个结点的指针指向第一个结点使之成为一个循环链表。
三、实验环境
操作系统:
Windows7
调试软件名称:
VisioStudio2017
上机地点:
信息楼B405
四、实验过程与分析
(1)主要的函数或操作内部的主要算法,分析这个算法的时、空复杂度,并说明设计的巧妙之处。
本实验中主要的函数包括创建链表、显示链表内容和出列过程四个部分。
主要函数的代码如下:
创建链表:
typedefintDatatype;
typedefstructnode
的文件,然后编译生成.obj的文件,通过连接将目标文件连接生成一个.exe文件,之后运行文件就可以执行了。
六、附录
(1)实验设想和建议
这次实验提高了我对数据结构中关于循环链表和顺序表的理解,提高了我的编程能力,学校以后最好可以增加实验课的课时,这样我们可以更大程度的提高自己的编程能力。
另外我认为该实验不仅可以使用使用链表指针来实现,还可以使用数组来模拟链表来实现约瑟夫环,用数组的下标来指向前一个和后一个元素,之后进行删除来实现约瑟夫环。
(2)参考资料:
《数据结构(第二版)》闫玉宝编着清华大学出版社
实验报告
课程名称:
数据结构
班级:
实验成绩:
实验名称:
栈、队列、字符串和数组
学号:
批阅教师签字:
实验编号:
实验二
姓名:
实验日期:
2017-11-20
指导教师:
组号:
实验时间:
18:
30~22:
30
一、实验目的
(1)掌握栈、队列、串和数组的抽象数据类型的特征。
(2)掌握栈、队列、串和数组的抽象数据类型在计算机中的实现方法。
(3)学会使用栈、队列来解决一些实际的应用问题。
2、实验内容与实验步骤
(1)实验内容:
假设表达式中除了变量名、常量和运算符外,还可以允许两种括号:
圆括号和中括号,其嵌套的次序随意,编写程序检验输入的表达式中括号的的顺序是否合法。
(2)描述抽象数据类型或设计的函数描述,说明为什么要使用这种抽象数据类型,并说明解决设想。
抽象数据类型或函数描述:
首先定义了一个结构体并且声明为栈类型,在其中定义了空间基地址的指针、栈顶指针以及栈存储空间的大小。
之后设计了Creat_Stack的函数,用此函数来创建一个空栈,这样可以使用堆栈来实现括号匹配的功能,又设计了一个名为Stack_Full的函数了来判断栈是否已满,若栈未满才可继续之后的压栈功能,如果堆栈已满,则需要使用realloc来动态分配空间,扩大栈的存储空间。
我还设计了一个名为empty的函数,用它来判断堆栈是否为空,堆栈为空或不为空时分别返回0或1。
之后设计了名为push和pop的函数来实现括号的入栈和出栈,之后设计了名为Match的函数,来判断括号是否匹配,设计了名为clean的函数来清空堆栈,这样可以连续判断不同的多项式的括号是否匹配。
解决设想:
对于本题,首先我使用了栈结构,利用栈中数据“先进后出”的特点来实现对括号是否匹配的检验。
实现过程基本如下:
从左到右依次扫描多项式,如果遇到左括号便将左括号入栈,在所有左括号入栈之后便可以扫描到右括号,如果扫描到的右括号和栈顶的左括号可以匹配时,将左括号出栈,以此类推,最后判断栈是否为空,若为空,则括号匹配,否则括号不匹配。
3、实验环境
操作系统:
Windows7
调试软件名称:
VisioStudio2017
上机地点:
信息楼B405
四、实验过程与分析
(1)实现时,主要的函数或操作内部的主要算法,分析这个算法的时、空复杂度,并说明设计的巧妙之处。
主要函数或操作内部的主要算法:
typedefstruct
的文件,然后编译生成.obj的文件,通过连接将目标文件连接生成一个.exe文件,之后运行文件就可以执行了。
六、附录
实验参考的资料《数据结构(第二版)》闫玉宝编着清华大学出版社
思考题
(a)栈和队列在计算机系统中有哪些应用写出你知道的系统中,这两种抽象数据类型的应用。
答:
在计算机系统中,使用栈的应用有表达式的计算,迷宫以及括号匹配等。
使用队列的应用有打印文档,售票系统,解决主机与外部设备之间速度不匹配问题,解决多用户引起的资源竞争问题等
(b)在程序调用的时侯,需要进行函数的切换,你认为函数在进行切换时系统要做那些工作
答:
对于函数的切换,主要是一个压栈的过程,先以一种约定的方式把参数压栈,然后根据函数地址调用函数,函数执行后根据约定的方式出栈取得参数。
实验报告
课程名称:
数据结构
班级:
实验成绩:
实验名称:
栈、队列、字符串和数组
学号:
批阅教师签字:
实验编号:
实验三
姓名:
实验日期:
2017-12-7
指导教师:
组号:
实验时间:
18:
30~22:
30
一、实验目的
(1)理解分治法的思想。
(2)掌握用分治法解决问题
二、实验内容
(1)仔细阅读备选实验的题目,选择一个(可选多个)作为此次实验题目,设计的程序要满足正确性,代码中有关键的注释,书写格式清晰,简洁易懂,效率较高,利用C++的模板,设计的程序通用性好,适合各种合理输入,并能对不合理输入做出正确的提示。
(2)归并排序
问题描述
目前的网上拍卖系统会显示很多待拍卖的物品,通常这些系统具有按照某个关键字对打出的广告进行排序列出的功能,并且能够按照用户输入的某个关键字进行过虑,找到某些特定的物品。
编程任务
定义一个Advertisement类,该类中至少包含该物品的数量,名称,联系人e-mail,最好有开拍时间及关闭时间,根据用户输入的关键字比如名称,mail,时间等,利用非递归的归并排序对所有的广告进行排序,并列出所有排好序的广告。
数据输入
由文件提供输入的所有广告信息。
程序中由用户输入要排序的关键字。
结果输出
程序运行结束时,排好序的广告输出到文件中,并为每个广告添加序号。
输入文件示例
输出文件示例
Coat(物品名称)
3(数量)
Skirt
5
Cap
7
Title(用户输入按照title排序)
2
Cap
7
3
Coat(物品名称)
3(数量)
4
Skirt
5
三、实验环境
操作系统:
Windows7
调试软件名称:
VisioStudio2017
上机地点:
信息楼B405
四、问题分析
(1)分析要解决的问题,给出你的思路,可以借助图表等辅助表达。
答:
归并操作的工作原理如下:
1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
2.设定两个指针,最初位置分别为两个已经排序序列的起始位置
3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指4.针到下一位置
5.重复步骤3直到某一指针达到序列尾
6.将另一序列剩下的所有元素直接复制到合并序列尾
(2)分析利用你的想法解决该问题可能会有怎样的时空复杂度。
时间O(nlogn) 空间O(n)
五、问题解决
(1)描述你在进行实现时,主要的函数或操作内部的主要算法;分析这个算法的时、空复杂度,并说明你设计的巧妙之处,如有创新,将其清晰的表述.
算法设计:
voidMergeSort(int*data,intn){
intstep=1;
while(step for(inti=0;i<=n-step-1;i+=2*step) Merge(data,i,i+step,step,n); 序运行截图: 实验报告 课程名称: 数据结构 班级: 实验成绩: 实验名称: 栈、队列、字符串和数组 学号: 批阅教师签字: 实验编号: 实验四 姓名: 实验日期: 2017-12-18 指导教师: 组号: 实验时间: 18: 30~22: 30 一、实验目的 (1)熟练掌握动态规划思想及教材中相关经典算法。 (2)掌握用动态规划解题的基本步骤,能够用动态规划解决一些问题。 二、实验内容与实验步骤 (1)仔细阅读备选实验的题目,选择一个(可选多个)作为此次实验题目,设计的程序要满足正确性,代码中有关键的注释,书写格式清晰,简洁易懂,效率较高,利用C++的模板,设计的程序通用性好,适合各种合理输入,并能对不合理输入做出正确的提示。 (2)可供选择的题目有以下2个: (i)找零钱问题(难度系数为3) 问题描述 设有n种不同面值的硬币,各硬币的面值存于数组T[1: n]中。 现要用这些面值的硬币来找钱,可以实用的各种面值的硬币个数不限。 当只用硬币面值T[1],T[2],…,T[i]时,可找出钱数j的最少硬币个数记为C(i,j)。 若只用这些硬币面值,找不出钱数j时,记C(i,j)=∞。 编程任务 设计一个动态规划算法,对1≤j≤L,计算出所有的C(n,j)。 算法中只允许实用一个长度为L的数组。 用L和n作为变量来表示算法的计算时间复杂性 数据输入 由文件提供输入数据。 文件的第1行中有1个正整数n(n<=13),表示有n种硬币可选。 接下来的一行是每种硬币的面值。 由用户输入待找钱数j。 结果输出 程序运行结束时,将计算出的所需最少硬币个数输出到文件中。 输入文件示例 输出文件示例 3 125 9 3 三、实验环境 操作系统: Windows7 调试软件名称: VisioStudio2017 上机地点: 信息楼B405 四、问题分析 分析要解决的问题,给出你的思路,可以借助图表等辅助表达。 答: 这个问题用动态规划来解,归结到动态规划上面就变成了无限背包问题(因为收银台的硬币默认是无穷的,但一种改进版本可以考察有限硬币的情况)。 区别在于,现在我们需要求一个最少的硬币数而不是最大值。 但是选择的情况也是相同的,即每次选择都可以选择任何一种硬币。 首先,找零钱问题具有最优子结构性质: 兑换零钱问题的最优子结构表述: 对于任意需要找的钱数j,一个利用T[n]中的n个不同面值钱币进行兑换零钱的最佳方案为P(T (1),j),P(T (2),j),...,P(T(n),j),即此时的最少钱币个数 ,则P(T (2),j),...,P(T(n),j)一定是利用T[n]中n个不同的面值钱币对钱数j=j-P(T (1),j)*T (1)进行兑换零钱的最佳方案。 其次,找零钱问题具有重叠于问题性质: 当n=1时,即只能用一种钱币兑换零钱,钱币的面值为T[0],有 b)当n>1时, 若j>T[n],即第n种钱币面值比所兑换零钱数小,因此有 。 当k为 时,C(n,j)达到最小值,有P(T(k0),j)=P(T( ),j-T( ))+1 若j=T[n],即用n种钱币兑换零钱,第n种钱币面值与兑换零钱数j相等,此时有C(n,j)=C(n,T[n])=1; 若j 从以上讨论可知该问题具有重叠子问题性质。 根据分析建立正确的递归关系。 答: 分析利用你的想法解决该问题可能会有怎样的时空复杂度。 答: 算法的时间复杂度主要取决于程序的两个循环,所以算法的时间复杂度为 ;算法执行过程中引入了一个二维数组,随着输入规模的增大,所需要的空间复杂度为: 五、问题解决 (1)根据对问题的分析,写出解决办法。 答: 设数组T[]中存放的是n种钱币递增的不同面值,所要找的钱数为M,M由用户输入;数组C[j]表示利用数T[n]兑换零钱数为j时所用的最少钱币个数,即最优值;P[i][j](1<=i<=n)表示按照上述最优值兑换零钱J时用到钱币面值为第i种钱币的个数。 (2)描述你在进行实现时,主要的函数或操作内部的主要算法;分析这个算法的时、空复杂度,并说明你设计的巧妙之处,如有创新,将其清晰的表述。 #include usingnamespacestd; intmain(){ intc; inta25=0,a10=0,a5=0,a2=0,a1=0; cout<<"请输入要找的零钱: "< cin>>c; a25=(c/25); a10=(c%25)/10; a5=(c%25)%10/5; a2=(c%25)%10%5/2; a1=(c%25)%10%5%2; cout<<"需要找以下几种零钱: "< cout<<"25分的"< cout<<"10分的"< cout<<"5分的"< cout<<"2分的"< cout<<"1分的"< 时间复杂度: 从上面算法可知,最优值c[』]的计算过程中,最外层为循环for(j=1;j<=M;j++)嵌套着while(k>1&&flag==0)循环,而while(k>1&flag==0)循环中又嵌套着三个并列的for循环。 因此本算法最坏情况下的复杂度是O(M* );最好的情况当然是里面for循环的条件不满足而不执行,此时的复杂度为O(M*n)。 其中: M表示需要兑换的零钱数,对于M来说,该值一般不是很大,对于钱币来说,M会小于100元,即10000分;n表示钱币的种类,n值一般不会很大.如钱币总的有13种(从1分,2分,,100元)。 经过以上分析,如是最坏情况时的复杂度应为O(M* ),则该值对于内存和运行速度较小的自动售货机等的应用前景则不会很好。 但本算法中的递归结构在M>T[n]时,有 。 可见对于钱币j=M时,求c(n,j)时,并不要求对从1≤i≤j,的所有情况都要求c(n,i)+1,而是只求 。 其中: 1≤k≤n。 钱币一般只有13种左右,因此其效率大为上升。 最坏的情况下需要执行 ,而M小于100元即10000分,远大于n。 本算法的动态规划算法的时间复杂性比该问题的一般动态规划算法的效率要好得多。 该算法的时间复杂性是 数量级的.对于应用于自动售货机等运行速度较慢的机器来说是不成问题的。 空间复杂度: 从上面算法可知,用到了三个数组,分别为T[n],c[j],P[i][j]。 其中: i<=n,j<=M。 空间复杂性主要由P[1][j]决定,为O(M×n)。 P(i,j)中的i指的T[n]中的值.对于钱币来说一般n为13左右。 该算法的空间复杂度为O(Mxn)=O(f),而M小于100元即10000分,远大于n。 该算法动态规划的空间复杂性比该问题的一般动态规划的效率要好得多。 该算法的空间复杂性为 数量级,这对于应用到小内存的自动售货机来说是没有任何问题的。 (3)你在调试过程中发现了怎样的问题又做了怎样的改进 答: 在调试过程中,我发现对于该算法最主要的在于矩阵C[i,j]的求解,而算法的递归关系没有弄明白,所以在求解C[i,j]时总是出现问题,后来在查询了资料后,将C[i,j]递归关系的实现改为c[j]=temptotal/T[j];temptotal=temptotal-T[j]*c[j];tempcount=tempcount+c[j];解决了该问题。 (4)写出用你的测试数据按照算法的流程填写的算法中的存储结构。 C[1,2,3]={0,2,9}。 六、实验结果总结 1.程序运行截图: 2.回答以下问题: (2)算法实现的复杂度在问题规模很大时可以接受吗 答: 可以接受,因为动态规划算法有很好的效率,所以当问题复杂度很大时,就不会影响到算法的运行时间。 (3)如果不用动态规划方法还能想到其他的解决方式吗和动态规划相比会有更好的效率吗 答: 对于找硬币问题,有时候贪心算法也能解决,但不如动态规划求解有效率,所以采用动态规划方法是一个很好的选择。 (4)所选用的数据结构合适吗 答: 采用了数组的数据结构,合适,因为该数据结构能够支持对于数组中的元素的随机访问,而且方便查询。 (5)该算法都存在哪几类可能出现的情况,你的测试完全覆盖了你所想到的这些情况吗,测试结果如何 (6)叙述通过实验你对动态规划方法的理解及其优缺点 答: 优点: 动态规划方法有效利用了子问题的重叠性,减少了大量的计算。 而且动态规划的使用也非常简单,只需要问题满足最优子结构、子问题重叠性、无后效性即可。 通常可以利用分置思想构造出子问题的分解方法,就可以利用动态规划。 缺点: 动态规划的缺点并不是最快的方法,只是解决某一类型的问题的工具或者优化某些NPC问题的时间效率。 动态规划的很重要的一点就是用大量空间换取时间上的优化,所以这并不是一个完美的方法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东北大学 数据结构 实验 告终 审稿