数据结构报告
- 格式:doc
- 大小:139.50 KB
- 文档页数:11
数据结构实验报告栈进制转换数据结构实验报告栈进制转换一、实验目的栈是一种常见的数据结构,本实验的目的在于通过实现栈的基本操作,设计并实现一个进制转换的程序,并通过实验验证程序的正确性和效率。
二、实验原理1.栈的定义和基本操作栈是一种后进先出(Last In First Out,简称LIFO)的数据结构。
它可以通过一个指针来标识当前栈顶元素,栈顶指针top的起始值为-1,空栈时top=-1.2.栈的进制转换将一个十进制数转换为其他进制(如二进制、八进制、十六进制)的过程中,可以通过栈来实现。
具体步骤如下:- 初始化一个空栈;- 将十进制数依次除以目标进制的基数,将余数依次入栈,直到商为0;- 依次出栈,将出栈的余数组合起来,得到转换后的目标进制数。
三、实验内容1.实现栈的基本操作(1)定义栈结构,包括元素数组和栈顶指针;(2)实现入栈操作push(),将元素插入到栈顶;(3)实现出栈操作pop(),从栈顶删除一个元素并返回其值;(4)实现获取栈顶元素的操作getTop(),返回栈顶元素的值;(5)实现判断栈是否为空的操作isEmpty(),返回布尔值;(6)实现判断栈是否已满的操作isFull(),返回布尔值。
2.设计并实现进制转换的程序(1)初始化一个空栈用于存放转换后的数字;(2)输入十进制数num和目标进制target;(3)通过栈的操作将num转换为target进制数;(4)输出转换后的结果。
四、实验步骤1.实现栈的基本操作(1)定义栈的结构和相关操作;(2)编写相应的测试代码,验证栈的基本操作是否正确。
2.设计并实现进制转换的程序(1)根据原理部分的步骤,设计转换程序的具体逻辑;(2)编写相应的测试代码,验证转换程序的正确性和效率。
五、实验结果与分析1.给定一个十进制数num=12345,目标进制为二进制(target=2),经过进制转换后得到的结果为.111.2.给定一个十进制数num=456,目标进制为八进制(target=8),经过进制转换后得到的结果为.710.本实验的结果表明,转换程序能够正确地将十进制数转换为目标进制数,并且具有较高的效率。
数据结构实验报告实验总结本次数据结构实验主要涉及线性表、栈和队列的基本操作以及链表的应用。
通过实验,我对这些数据结构的特点、操作和应用有了更深入的了解。
下面对每一部分实验进行总结。
实验一:线性表的基本操作线性表是一种常见的数据结构,本实验要求实现线性表的基本操作,包括插入、删除、查找、遍历等。
在实验过程中,我对线性表的结构和实现方式有了更清晰的认识,掌握了用数组和链表两种方式实现线性表的方法。
实验二:栈的应用栈是一种后进先出(LIFO)的数据结构,本实验要求利用栈实现简单的括号匹配和后缀表达式计算。
通过实验,我了解到栈可以方便地实现对于括号的匹配和后缀表达式的计算,有效地解决了对应的问题。
实验三:队列的应用队列是一种先进先出(FIFO)的数据结构,本实验要求利用队列实现银行排队和迷宫求解。
通过实验,我对队列的应用有了更加深入的了解,了解到队列可以解决需要按顺序处理的问题,如排队和迷宫求解等。
实验四:链表的应用链表是一种常用的数据结构,本实验要求利用链表实现学生信息管理系统。
通过实验,我对链表的应用有了更深入的了解,了解到链表可以方便地实现对于数据的插入、删除和修改等操作,并且可以动态地调整链表的长度,适应不同的需求。
通过本次实验,我掌握了线性表、栈、队列和链表的基本操作,并了解了它们的特点和应用方式。
同时,通过实际编程的过程,我对于数据结构的实现方式和效果有了更直观的认识,也锻炼了自己的编程能力和解决问题的能力。
在实验过程中,我遇到了一些问题,如程序逻辑错误和内存泄漏等,但通过调试和修改,最终成功解决了这些问题,对自己的能力也有了更多的信心。
通过本次实验,我深刻体会到了理论与实践的结合的重要性,也对于数据结构这门课程有了更加深入的理解。
总之,本次数据结构实验给予了我很多有益的启发和收获,对于数据结构的概念、特点和应用有了更深入的理解。
在以后的学习中,我会继续加强对数据结构的学习和研究,不断提高自己的编程能力和解决问题的能力。
哈工程数据结构实验报告一、实验目的本实验的目的是通过对于哈工程的数据结构实验的实践操作,掌握并理解数据结构中的哈希表的基本原理、实现方式,以及相关的查找、插入和删除操作。
通过实验的实践操作,进一步加深对于数据结构的理解和运用能力。
二、实验步骤和实验原理1.实验环境本次实验使用的是C++语言在Visual Studio环境下进行开发。
2.实验内容本次实验主要涉及到哈希表的构建和相关操作的实践。
具体步骤如下:(1)首先创建一个结构体,包括学生姓名和学号等信息。
(2)然后定义哈希表的存储结构,其中包括哈希表的大小、装填因子等。
(3)根据哈希表的大小,创建一个存储结点的数组。
(4)实现哈希函数,根据学生学号计算哈希值。
(5)实现插入操作,即将结点插入到哈希表中的合适位置。
(6)实现查找操作,根据学生学号查找对应的结点。
(7)实现删除操作,根据学生学号删除对应的结点。
(8)测试程序的运行效果,包括对哈希表进行插入、查找和删除操作等。
三、实验结果与分析通过对实验的步骤和原理的实践操作,成功构建了一个哈希表,并实现了插入、查找和删除操作。
在实验结果的分析中,可以发现哈希表具有一定的优势:通过哈希函数的映射,可以将元素快速地插入到对应的位置,从而实现了快速的查找和删除操作。
四、实验总结通过本次实验,我对于哈希表的原理、实现方式以及相关操作有了更深刻的理解。
通过实践操作,我进一步加深了对于数据结构的掌握和运用能力。
同时,我也认识到哈希表在实际应用中的重要性和优势,对于提高数据处理和查询效率有着重要的作用。
期待在日后的学习和工作中能够更加深入地学习和应用数据结构的知识,提升自己的技术水平和能力。
一、实验背景数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织和存储数据,并实现对数据的检索、插入、删除等操作。
为了更好地理解数据结构的概念和原理,我们进行了一次数据结构实训实验,通过实际操作来加深对数据结构的认识。
二、实验目的1. 掌握常见数据结构(如线性表、栈、队列、树、图等)的定义、特点及操作方法。
2. 熟练运用数据结构解决实际问题,提高算法设计能力。
3. 培养团队合作精神,提高实验报告撰写能力。
三、实验内容本次实验主要包括以下内容:1. 线性表(1)实现线性表的顺序存储和链式存储。
(2)实现线性表的插入、删除、查找等操作。
2. 栈与队列(1)实现栈的顺序存储和链式存储。
(2)实现栈的入栈、出栈、判断栈空等操作。
(3)实现队列的顺序存储和链式存储。
(4)实现队列的入队、出队、判断队空等操作。
3. 树与图(1)实现二叉树的顺序存储和链式存储。
(2)实现二叉树的遍历、查找、插入、删除等操作。
(3)实现图的邻接矩阵和邻接表存储。
(4)实现图的深度优先遍历和广度优先遍历。
4. 算法设计与应用(1)实现冒泡排序、选择排序、插入排序等基本排序算法。
(2)实现二分查找算法。
(3)设计并实现一个简单的学生成绩管理系统。
四、实验步骤1. 熟悉实验要求,明确实验目的和内容。
2. 编写代码实现实验内容,对每个数据结构进行测试。
3. 对实验结果进行分析,总结实验过程中的问题和经验。
4. 撰写实验报告,包括实验目的、内容、步骤、结果分析等。
五、实验结果与分析1. 线性表(1)顺序存储的线性表实现简单,但插入和删除操作效率较低。
(2)链式存储的线性表插入和删除操作效率较高,但存储空间占用较大。
2. 栈与队列(1)栈和队列的顺序存储和链式存储实现简单,但顺序存储空间利用率较低。
(2)栈和队列的入栈、出队、判断空等操作实现简单,但需要考虑数据结构的边界条件。
3. 树与图(1)二叉树和图的存储结构实现复杂,但能够有效地表示和处理数据。
数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。
具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。
2、理解栈和队列的特性,并能够实现其基本操作。
3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。
4、学会使用图的数据结构,并实现图的遍历和相关算法。
二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。
三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。
实现顺序表的初始化、插入、删除和查找操作。
2、链表的实现定义链表的节点结构,包含数据域和指针域。
实现链表的创建、插入、删除和查找操作。
(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。
实现栈的入栈、出栈和栈顶元素获取操作。
2、队列的实现采用循环队列的方式实现队列的数据结构。
完成队列的入队、出队和队头队尾元素获取操作。
(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。
2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。
3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。
(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。
2、图的遍历实现深度优先遍历和广度优先遍历算法。
四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。
删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。
2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。
(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。
入栈和出栈操作的时间复杂度均为 O(1)。
2、队列队列的特点是先进先出,常用于排队、任务调度等场景。
数据结构实验报告一、实验目的本实验旨在通过对数据结构的学习和实践,掌握基本的数据结构概念、原理及其应用,培养学生的问题分析与解决能力,提升编程实践能力。
二、实验背景数据结构是计算机科学中的重要基础,它研究数据的存储方式和组织形式,以及数据之间的关系和操作方法。
在软件开发过程中,合理选用和使用数据结构,能够提高算法效率,优化内存利用,提升软件系统的性能和稳定性。
三、实验内容本次实验主要涉及以下几个方面的内容:1.线性表的基本操作:包括线性表的创建、插入、删除、查找、修改等操作。
通过编程实现不同线性表的操作,掌握它们的原理和实现方法。
2.栈和队列的应用:栈和队列是常用的数据结构,通过实现栈和队列的基本操作,学会如何解决实际问题。
例如,利用栈实现括号匹配,利用队列实现银行排队等。
3.递归和回溯算法:递归和回溯是解决很多求解问题的常用方法。
通过编程实现递归和回溯算法,理解它们的思想和应用场景。
4.树和二叉树的遍历:学习树和二叉树的遍历方法,包括前序、中序和后序遍历。
通过编程实现这些遍历算法,加深对树结构的理解。
5.图的基本算法:学习图的基本存储结构和算法,包括图的遍历、最短路径、最小生成树等。
通过编程实现这些算法,掌握图的基本操作和应用。
四、实验过程1.具体实验内容安排:根据实验要求,准备好所需的编程环境和工具。
根据实验要求逐步完成实验任务,注意记录并整理实验过程中遇到的问题和解决方法。
2.实验数据采集和处理:对于每个实验任务,根据要求采集并整理测试数据,进行相应的数据处理和分析。
记录实验过程中的数据和结果。
3.实验结果展示和分析:将实验结果进行适当的展示,例如表格、图形等形式,分析实验结果的特点和规律。
4.实验总结与反思:总结实验过程和结果,回顾实验中的收获和不足,提出改进意见和建议。
五、实验结果与分析根据实验步骤和要求完成实验任务后,得到了相应的实验结果。
对于每个实验任务,根据实验结果进行适当的分析。
优秀数据结构实践报告体会范文(15篇)优秀数据结构实践报告体会范文(15篇)篇一随着个人的文明素养不断提升,报告的使用成为日常生活的常态,报告具有成文事后性的特点。
那么报告应该怎么写才合适呢?下面是小编收集整理的体会社会实践报告,希望对大家有所帮助。
大学的第二个暑假到来了,应学校的提议和社会对大学生的要求,我参加了暑期社会实践活动。
在这又一次的活动中,我学到了很多,也感悟了很多。
下面就我这次暑期社会实践的心得做一总结。
因为我是计算机学院的学生,所以我在这学期的社会实践中去了家附近的塑料厂帮助整理资料和制作表格。
暑期社会实践,是我们大学生充分利用暑期的时间,以各种方式深入社会之中展开形式多样的各种实践活动。
积极地参加社会实践活动,能够促进我们对社会的了解,提高自身对经济和社会发展现状的认识,实现书本知识和实践知识的更好结合,帮助我们树立正确的世界观、人生观和价值观;大学生社会实践活动是全面推进素质教育的重要环节,是适应新世纪社会发展要求,培养全面发展型人才的需要,是加强集体主义,爱国主义,社会主义教育,升华思想的有效途径。
积极投身社会实践,深入群众,了解社会,增长才干,是青年学生成长成才的正确道路,是青年学生运用所学知识技能,发挥聪明才智,积极为社会作贡献的重要途径。
暑期社会实践则恰恰为我们提供了一个走出校园,踏上社会,展现自我的绚丽舞台。
利用假期参加有意义的社会实践活动,接触社会,了解社会,从社会实践中检验自我。
在实践中积累社会经验,在实践中提高自己的能力,这将为我们以后走出社会打下坚实的基础!年少轻狂,经受不住暴雨的洗礼?谁说象牙塔里的我们两耳不闻窗外事,一心只读圣贤书?走出校园,踏上社会,我们能否不辜负他人的`期望,为自己书写一份满意的答卷。
在注重素质教育的今天,大学生假期社会实践作为促进大学生素质教育,加强和改进青年学生思想政治工作,引导学生健康成长成才的重要举措,作为培养和提高学生实践、创新和创业能力的重要途径,一直来深受学校的高度重视。
南邮数据结构实验报告实验目的,通过本次实验,我们旨在加深对数据结构的理解,掌握数据结构的基本操作和算法设计能力,提高对数据结构的应用能力和实际问题的解决能力。
一、实验内容。
1. 实验一,线性表的基本操作。
本次实验中,我们首先学习了线性表的基本概念和操作,包括插入、删除、查找等操作,并通过实际编程操作来加深对线性表的理解。
2. 实验二,栈和队列的应用。
在实验二中,我们通过实际编程操作来学习栈和队列的应用,包括中缀表达式转换为后缀表达式、栈的应用、队列的应用等内容。
3. 实验三,树和二叉树的基本操作。
实验三中,我们学习了树和二叉树的基本概念和操作,包括树的遍历、二叉树的建立和遍历等内容,并通过实际编程操作来加深对树和二叉树的理解。
4. 实验四,图的基本操作。
最后,我们学习了图的基本概念和操作,包括图的存储结构、图的遍历等内容,并通过实际编程操作来加深对图的理解。
二、实验过程。
在实验过程中,我们首先对实验内容进行了深入的学习和理解,掌握了数据结构的基本概念和操作方法。
然后,我们通过实际编程操作来加深对数据结构的理解,并通过调试和修改程序来提高对数据结构的应用能力和实际问题的解决能力。
在实验过程中,我们遇到了一些问题,但通过不懈的努力和团队合作,最终顺利完成了实验任务。
三、实验结果与分析。
通过本次实验,我们深入理解了数据结构的基本概念和操作方法,掌握了线性表、栈、队列、树、二叉树和图的基本操作,并通过实际编程操作加深了对数据结构的理解。
同时,我们也提高了对数据结构的应用能力和实际问题的解决能力,为今后的学习和工作打下了坚实的基础。
四、实验总结。
通过本次实验,我们不仅加深了对数据结构的理解,还提高了对数据结构的应用能力和实际问题的解决能力。
在今后的学习和工作中,我们将继续努力,不断提升自己的专业能力,为将来的发展打下坚实的基础。
以上就是本次实验的报告内容,谢谢!。
深 圳 大 学 实 验 报 告课程名称: 数据结构实验与课程设计 实验项目名称: 实验一:顺序表的应用 学院: 计算机与软件学院 专业: 指导教师: **报告人: 文成 学号: ********** 班级: 5 实验时间: 2012-9-17实验报告提交时间: 2012-9-24教务部制一、实验目的与要求:目的:1.掌握线性表的基本原理2.掌握线性表地基本结构3.掌握线性表地创建、插入、删除、查找的实现方法要求:1.熟悉C++语言编程2.熟练使用C++语言实现线性表地创建、插入、删除、查找的实现方法二、实验内容:Problem A: 数据结构——实验1——顺序表例程Description实现顺序表的创建、插入、删除、查找Input第一行输入顺序表的实际长度n第二行输入n个数据第三行输入要插入的新数据和插入位置第四行输入要删除的位置第五行输入要查找的位置Output第一行输出创建后,顺序表内的所有数据,数据之间用空格隔开第二行输出执行插入操作后,顺序表内的所有数据,数据之间用空格隔开第三行输出执行删除操作后,顺序表内的所有数据,数据之间用空格隔开第四行输出指定位置的数据Sample Input611 22 33 44 55 66888 352Sample Output11 22 33 44 55 6611 22 888 33 44 55 6611 22 888 33 55 6622HINT第i个位置是指从首个元素开始数起的第i个位置,对应数组内下标为i-1的位置Problem B: 数据结构——实验1——顺序表的数据交换Description实现顺序表内的元素交换操作Input第一行输入n表示顺序表包含的·n个数据第二行输入n个数据,数据是小于100的正整数第三行输入两个参数,表示要交换的两个位置第四行输入两个参数,表示要交换的两个位置Output第一行输出创建后,顺序表内的所有数据,数据之间用空格隔开第二行输出执行第一次交换操作后,顺序表内的所有数据,数据之间用空格隔开第三行输出执行第二次交换操作后,顺序表内的所有数据,数据之间用空格隔开注意加入交换位置的合法性检查,如果发现位置不合法,输出error。
国开数据结构(本)数据结构课程实验报告1. 实验目的本次实验的主要目的是通过实际操作,掌握数据结构的基本概念、操作和应用。
通过对实验内容的了解和实际操作,达到对数据结构相关知识的深入理解和掌握。
2. 实验工具与环境本次实验主要使用C++语言进行编程,需要搭建相应的开发环境。
实验所需的工具和环境包括:C++编译器、集成开发环境(IDE)等。
3. 实验内容本次实验主要包括以下内容:3.1. 实现顺序存储结构的线性表3.2. 实现链式存储结构的线性表3.3. 实现栈和队列的顺序存储结构和链式存储结构3.4. 实现二叉树的顺序存储结构和链式存储结构3.5. 实现图的邻接矩阵和邻接表表示4. 实验步骤实验进行的具体步骤如下:4.1. 实现顺序存储结构的线性表- 定义数据结构- 实现插入、删除、查找等操作4.2. 实现链式存储结构的线性表- 定义数据结构- 实现插入、删除、查找等操作4.3. 实现栈和队列的顺序存储结构和链式存储结构- 定义数据结构- 实现入栈、出栈、入队、出队操作4.4. 实现二叉树的顺序存储结构和链式存储结构- 定义数据结构- 实现插入、删除、查找等操作4.5. 实现图的邻接矩阵和邻接表表示- 定义数据结构- 实现插入、删除、查找等操作5. 实验结果与分析通过对以上实验内容的实现和操作,得到了以下实验结果与分析: 5.1. 顺序存储结构的线性表- 实现了线性表的插入、删除、查找等操作- 通过实验数据进行性能分析,得出了相应的性能指标5.2. 链式存储结构的线性表- 实现了线性表的插入、删除、查找等操作- 通过实验数据进行性能分析,得出了相应的性能指标5.3. 栈和队列的顺序存储结构和链式存储结构- 实现了栈和队列的入栈、出栈、入队、出队操作- 通过实验数据进行性能分析,得出了相应的性能指标5.4. 二叉树的顺序存储结构和链式存储结构- 实现了二叉树的插入、删除、查找等操作- 通过实验数据进行性能分析,得出了相应的性能指标5.5. 图的邻接矩阵和邻接表表示- 实现了图的插入、删除、查找等操作- 通过实验数据进行性能分析,得出了相应的性能指标6. 总结与展望通过本次数据结构课程的实验,我们深入了解并掌握了数据结构的基本概念、操作和应用。
武汉轻工大学数学与计算机学院《数据结构》课程设计说明书题目:车厢调度专业:信息管理与信息系统班级:信息管理1201 学号: 1205020105020105 姓名:张瑜指导老师:欧阳峥峥2014年1月6日目录《数据结构》 (1)课程设计说明书 (1)1.设计背景 (3)1.1. 设计题目 (3)1.2. 设计目的 (3)1.3. 设计任务 (3)1.4.时间安排 (3)1.5. 设计内容 (3)2.总体设计 (4)2.详细设计 (4)2.1 (4)4.算法分析 (7)4.1时间空间复杂度 (7)4.2总结 (7)5.用户使用说明 (8)6.测试结果 (8)7.附录 (9)7.1源程序代码 (9)1.设计背景1.1. 设计题目车厢调度1.2. 设计目的数据结构课程设计是信息管理与信息系统专业的集中实践性环节之一,是学习完《数据结构》课程后进行的一次全面的综合练习。
其目的在于加深对数据结构的理解和掌握,使学生更好地掌握数据结构的特点、存储表示、运算方法及其应用,训练学生选用合适的数据结构编写质量高、风格好的应用程序的能力。
1.3. 设计任务每班每人按照学号的顺序依次选择1-10号设计题目,独立完成课题。
(即1、11、21号学生完成1号课题,2、12、22号学生完成2号题,以此类推)1.4.时间安排课程名称班级周次星期时间实验室数据结构课设信管1201 1 全周2013.12.30-2014.1.5 东8-417数据结构课设信管1202 1 全周2013.12.30-2014.1.5 东8-4191.5. 设计内容车厢调度【问题描述】假设停在铁路调度站入口处的车厢序列编号依次为1,2,3,……,n。
设计一个程序求出所有可能由此输出的长度为n的车厢序列。
【基本要求】首先在教科书3.1.2节中提供的栈的顺序存储结构SqStack之上实现栈的基本操作,即实现栈类型。
程序对栈的任何存取(即更改,读取和状态判别等操作)必须借助于基本操作进行。
【测试数据】分别取n=1,2,3,4【实现提示】一般的说,在操作过程的任何状态下都有两种可能的操作:“入”和“出”。
每个状态下处理问题的方法都是相同的,这说明问题本身具有天然的递归特性,可以考虑用递归算法实现。
输入序列可以仅由一对整型变量表示,即给出序列头/尾编号。
输出序列用栈实现是方便的2.总体设计1、用编号依次为1,2,3,……,n表示停在铁路调度站入口处的车厢序列。
2、用一个栈形象地表示为火车的调度站。
3、利用栈先进后出的性质,结合递归和回溯算法,实现编号1…n的车厢的所有可能的序列。
设计为了使车厢能够调度,需要定义一个栈,利用栈先进后出的性质,改变车厢的顺序。
对栈的抽象数据类型进行定义:ADT stack{数据对象:D={ai | ai∈CharSet,i=1,2,……,n,n≥0}数据关系; R={<ai-1,ai> | ai-1,ai∈D,i=2,……,n}}。
2.详细设计2.1.程序的存储结构采用栈的存储结构,存储结构如下:typedef struct{int *base;int *top;int stacksize;}SqStack;其中top为指向栈顶的指针,base为指向栈底的指针,stacksize为栈内元素的个数。
2.2.构造栈的操作由InitStack()函数实现,其具体实现函数如下:int InitStack(SqStack &S){If(!S.base=(int*)malloc(n*sizeof(int)))return -1;S.top=S.base;S.stacksize=n;return 1;}2.3.进栈操作由Push()函数实现,出栈操作由Pop()函数实现,判断栈是否为空用stackEmpty()函数实现,判断栈是否已满用stackFull()函数实现2.4. 最重要的一个实现调度的函数D_d(),由于车厢调度的次序比较多,经过分析火车进栈出栈的情况只有如下两种情况:2.4.1一辆辆车入栈后,要么立刻出栈,要么进行下一辆车的入栈。
2.4.2当栈非空时,一辆车出栈后,要么立刻出栈,要么进行下一辆车的入栈。
因此可以采用递归调用的方法实现车辆的调度,构建两个栈分别为Tstack和Ostack 来对车辆递归调度。
2.5.各函数的具体实现如下:void InitStack(SqStack &S)//初始化栈,分配内存空间{S.base=(int*)malloc(n*sizeof(int));if(!S.base){printf("分配失败");exit(-1);}S.top=S.base;S.stacksize=n;}int stackEmpty(SqStack S)//判断栈是否空{if(S.top==S.base)return 1;return 0;}int stackFull(SqStack S)//判断栈是否满{if(S.top-S.base>=n)return 1;return 0;}void Push(SqStack &S,int e)//将e进入栈S{*S.top++=e;}void Pop(SqStack &S,int &e)//出栈操作,将栈顶元素赋给e{if(!stackEmpty(S))e=*--S.top;}void Print(SqStack S)//输出的车厢序列{int *p;for(p=S.top;p!=S.base;)printf("%d",*--p);printf("\t");}void D_d(SqStack Tstack,SqStack Ostack,int i)//车厢调度函数的实现,采用递归思想{if(i<n){Push(Tstack,i+1);D_d(Tstack,Ostack,i+1);//一辆车进栈后,要么立刻出栈,要么进行下//一辆车的进栈Pop(Tstack,e);}if(!stackEmpty(Tstack)){Pop(Tstack,e);//当栈不为空时,一辆车出栈后,要么继续出栈,要么继续下一//辆车的进栈Push(Ostack,e);D_d(Tstack,Ostack,i);Pop(Ostack,e);Push(Tstack,e);}if(stackEmpty(Tstack)&&stackFull(Ostack))//当Tstack为空,且Ostack满// 了时,可以有一种可能输出序列产生Print(Ostack);}然后设定两个全局变量n和e,n用以表示车的辆数,e用以取栈顶元素。
4.算法分析4.1时间空间复杂度本程序主要用了一个求车厢调度的函数D_d(),因为用了一个递归算法,所以时间复杂度为O(n),空间复杂度为所用的两个栈。
4.2总结本次设计运用栈的基本操作InitStack(),Push(),Pop(),stackEmpty(), stackFull()对车厢的调度函数进行操作,用以上基本的操作实现函数D_d(),在进行D_d()函数进行设计时由于用了递归调用的思想,通过本次设计,对栈的基本操作有了更深刻的理解与应用。
运用栈的基本操作和递归思想实现了更加复杂的函数,对复杂问题的解决又提升了一定的基本功。
同时通过本次设计,深刻理解了函数形参中为什么要使用引用,使以前遇到的一些问题得到了解决。
5.用户使用说明在界面中输入车厢总数n,最后就能输出总数为n的所有可能的序列。
6.测试结果输入n=1:输入n=2:输入n=3:输入n=4:7.附录7.1源程序代码#include<stdio.h>#include<stdlib.h> int n,e;//定义两个全局变量,其中n为车厢的节数,e为用作取用栈定元素typedef struct{int *base;int *top;int stacksize;}SqStack;//定义了一个栈的基本存储结构void InitStack(SqStack &S);int stackEmpty(SqStack S);int stackFull(SqStack S);void Push(SqStack &S,int e);void Pop(SqStack &S,int &e);void Print(SqStack S);void D_d(SqStack Tstack,SqStack Ostack,int i);int main(){Sqstack Tstack,Ostack;//定义两个栈,其中一个栈Tstack作为中间变量,Ostack 作为输出的栈InitStack(Tstack);//构造栈TstackPush(Tstack,1);//将一号车厢进栈InitStack(Ostack);//构造栈Ostackprintf("请输入车厢尾编号n:");scanf("%d",&n);//输入车厢的节数printf("所有输出序列为:\n");D_d(Tstack,Ostack,1);//调用函数对车厢的调度情况进行排列return 0;}void InitStack(SqStack &S)//初始化栈,分配内存空间{S.base=(int*)malloc(n*sizeof(int));if(!S.base){printf("分配失败");exit(-1);}S.top=S.base;S.stacksize=n;}int stackEmpty(SqStack S)//判断栈是否空{if(S.top==S.base)return 1;return 0;}int stackFull(SqStack S)//判断栈是否满{if(S.top-S.base>=n)return 1;return 0;}void Push(SqStack &S,int e)//将e进入栈S{*S.top++=e;}void Pop(SqStack &S,int &e)//出栈操作,将栈顶元素赋给e {if(!stackEmpty(S))e=*--S.top;}void Print(SqStack S)//输出的车厢序列{int *p;for(p=S.top;p!=S.base;)printf("%d",*--p);printf("\t");}void D_d(SqStack Tstack,SqStack Ostack,int i)//车厢调度函数的实现,采用递归思想{if(i<n){Push(Tstack,i+1);D_d(Tstack,Ostack,i+1);//一辆车进栈后,要么立刻出栈,要么进行下//一辆车的进栈Pop(Tstack,e);}if(!stackEmpty(Tstack)){Pop(Tstack,e);//当栈不为空时,一辆车出栈后,要么继续出栈,要么继续下一//辆车的进栈Push(Ostack,e);D_d(Tstack,Ostack,i);Pop(Ostack,e);Push(Tstack,e);}if(stackEmpty(Tstack)&&stackFull(Ostack))//当Tstack为空,且Ostack满// 了时,可以有一种可能输出序列产生Print(Ostack);}11。