数据结构实验学期总结
- 格式:doc
- 大小:358.50 KB
- 文档页数:18
数据结构心得体会6篇(经典版)编制人:__________________审核人:__________________审批人:__________________编制单位:__________________编制时间:____年____月____日序言下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!并且,本店铺为大家提供各种类型的经典范文,如工作报告、演讲致辞、条据文书、合同协议、心得体会、自我鉴定、规章制度、教学资料、作文大全、其他范文等等,想了解不同范文格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!Moreover, our store provides various types of classic sample essays, such as work reports, speeches, written documents, contract agreements, insights, self-evaluation, rules and regulations, teaching materials, complete essays, and other sample essays. If you want to learn about different sample formats and writing methods, please pay attention!数据结构心得体会6篇写心得体会让我更加明确自己的价值观和人生目标,写心得体会可以帮助我更好地认识自己的身体和健康状况,下面是本店铺为您分享的数据结构心得体会6篇,感谢您的参阅。
数据结构实训总结数据结构是计算机科学中的重要概念,它涉及到数据的组织、存储和管理。
在数据结构的实训课程中,学生通过实践操作来加深对数据结构的理解和掌握。
本文将对数据结构实训进行总结,包括实训内容、实训过程、实训收获、实训问题和实训建议等方面。
一、实训内容1.1 排序算法:实现常见的排序算法,如冒泡排序、快速排序、插入排序等。
1.2 数据结构的实现:实现链表、栈、队列等数据结构,并进行相关操作。
1.3 树结构的应用:实现二叉树、二叉搜索树等树结构,并进行相关操作。
二、实训过程2.1 学习理论知识:在实训开始前,学生需要通过课堂学习来掌握数据结构的基本概念和算法原理。
2.2 编写代码实现:学生需要根据所学知识,使用编程语言来实现数据结构和算法。
2.3 调试和测试:完成代码编写后,学生需要进行调试和测试,确保程序能够正确运行并得到正确结果。
三、实训收获3.1 加深理解:通过实践操作,学生能够更深入地理解数据结构的原理和应用。
3.2 提升编程能力:实训过程中,学生需要不断编写代码实现算法,从而提升编程能力。
3.3 培养团队合作意识:在实训中,学生通常需要与同学合作完成任务,培养了团队合作意识。
四、实训问题4.1 理论与实践结合不足:有些学生在实训中只注重编程实现,而忽略了数据结构的理论知识。
4.2 编程能力不足:部分学生在实训中遇到困难,表现出编程能力不足的问题。
4.3 时间管理不当:有些学生在实训中时间规划不当,导致任务无法按时完成。
五、实训建议5.1 注重理论学习:在实训前应加强对数据结构理论知识的学习,为实践操作打下坚实基础。
5.2 多练习编程:通过不断练习编程,提升自己的编程能力,更好地应对实训任务。
5.3 合理规划时间:在实训过程中应合理规划时间,合理安排任务进度,避免出现时间不足的情况。
综上所述,数据结构实训是提升学生数据结构理论和实践能力的重要途径,通过实训的学习,学生能够更好地掌握数据结构的知识和应用,为将来的学习和工作打下坚实基础。
数据结构实验小结数据结构实验是大二上学期的一门实践课程,通过实验的方式来加深对数据结构的理解和应用。
本次实验主要围绕线性表和栈的实现展开,通过编程实践的方式来深入理解数据结构的基本概念和操作方法。
在实验过程中,我首先对线性表和栈的基本概念进行了复习和理解,掌握了它们的定义、特点以及常用的操作方法。
其次,我通过编写代码来实现线性表和栈的功能,包括插入、删除、查找等操作。
在编写代码的过程中,我发现了一些问题,例如在插入元素的时候没有考虑到空间不足的情况,导致程序出错。
通过不断调试和修改,我逐渐完善了程序的功能,提高了代码的效率和稳定性。
在实验中,我还学会了使用调试工具来查找和解决代码中的问题,例如使用断点、单步调试等方法来追踪程序的执行过程。
这些调试工具为我解决了一些编程中的困惑和疑惑,大大提高了代码的可读性和可维护性。
此外,在实验过程中,我还深刻认识到数据结构对程序性能的影响。
通过对比不同数据结构的实现效果,我发现在处理大规模数据和频繁进行插入、删除操作时,链表结构的性能要优于数组结构。
这给我在实际编程中选择合适的数据结构提供了指导和启示。
通过这门实验课程,我不仅对数据结构有了更加深入的了解,还掌握了一些实际编程的技巧和方法。
我深切体会到了理论与实践相结合的重要性,只有将所学的知识应用到实际中,才能真正加深对知识的理解和掌握。
总的来说,数据结构实验是一门非常有意义的课程,通过实践的方式帮助我们更加深入地了解和应用数据结构。
通过实验,我不仅掌握了数据结构的基本概念和操作方法,还学会了一些实际编程的技巧和方法。
通过这门实验课程的学习,我不仅提升了我的编程能力,还培养了我的实践能力和解决问题的能力。
我相信这些在以后的学习和工作中都会有很大的帮助。
数据结构实验报告总结本次数据结构实验主要涉及到线性表、栈和队列的基本操作,通过实验操作和总结,我对数据结构的相关知识有了更深入的理解和掌握。
首先,我们进行了线性表的实验操作。
线性表是一种数据结构,它是由n(n≥0)个数据元素组成的有限序列。
在实验中,我们学习了线性表的顺序存储结构和链式存储结构。
通过代码实现,我深刻理解了顺序表和链表的存储方式和特点。
在实验过程中,我发现顺序表适合查找操作,而链表适合插入和删除操作。
这让我对线性表的应用场景有了更清晰的认识。
其次,我们进行了栈的实验操作。
栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作。
在实验中,我学习了栈的基本操作,包括入栈和出栈。
通过实际操作,我深刻理解了栈的“先进后出”的特性,以及它在计算机程序设计中的应用。
我发现栈在递归算法、表达式求值和括号匹配等方面有着重要的作用,这让我对栈的实际应用有了更深入的认识。
最后,我们进行了队列的实验操作。
队列是一种特殊的线性表,它只能在表的一端进行插入操作,而在另一端进行删除操作。
在实验中,我学习了队列的基本操作,包括入队和出队。
通过实际操作,我深刻理解了队列的“先进先出”的特性,以及它在计算机程序设计中的重要性。
我发现队列在广度优先搜索、模拟系统等方面有着重要的应用,这让我对队列的实际应用有了更深入的了解。
通过本次数据结构实验,我不仅掌握了线性表、栈和队列的基本操作,还深刻理解了它们在实际应用中的重要性。
我相信这些知识和经验对我的学习和工作都将有着重要的帮助。
在未来的学习和实践中,我将继续加强对数据结构的理解和运用,不断提升自己的编程能力和解决问题的能力。
总之,本次数据结构实验让我受益匪浅,我将继续努力学习和实践,不断提升自己的专业能力。
希望通过不懈的努力,能够在数据结构领域取得更大的成就。
数据结构实验总结及心得体会引言数据结构作为计算机科学的基础课程,是理解和应用计算机编程的重要部分。
通过实验的形式,我们可以更加深入地理解不同数据结构的特点和应用场景。
本文将总结我在数据结构实验中的学习经验和心得体会。
实验一:线性表在线性表实验中,我学习了顺序表和链表两种基本的线性表结构。
顺序表使用数组来存储数据,具有随机访问的特点;链表使用指针来连接数据元素,具有插入和删除操作方便的特点。
通过这个实验,我深刻认识了线性表的存储结构和操作方法。
我遇到的难点是链表的插入和删除操作,因为涉及到指针的重新指向。
通过调试和分析代码,我逐渐理解了指针指向的含义和变化规律。
在实验结束后,我还进一步学习了循环链表和双向链表的特点和应用。
实验二:栈和队列栈和队列是两种常用的数据结构,可以用来解决很多实际问题。
在这个实验中,我学习了顺序栈、链式栈、顺序队列和链式队列四种基本实现方式。
实验中我遇到的最大困难是队列的循环队列实现,因为需要处理队列尾指针的位置变化。
我通过画图和调试发现了队列尾指针的变化规律,并在实验中成功实现了循环队列。
熟练掌握了栈和队列的操作方法后,我进一步学习了栈的应用场景,如表达式求值和括号匹配等。
队列的应用场景还有优先级队列和循环队列等。
实验三:串串是由零个或多个字符组成的有限序列,是实际应用中十分常见的数据类型。
在这个实验中,我学习了串的存储结构和常规操作。
实验中最具挑战性的部分是串的模式匹配。
模式匹配是在一个主串中查找一个子串的过程,可以使用暴力匹配、KMP 算法和BM算法等不同的匹配算法。
在实验中,我实现了KMP算法,并在实际应用中进行了测试。
从实验中我学到了使用前缀表和后缀表来提高模式匹配的效率。
同时,在应用中也了解到了串的搜索和替换等常见操作。
实验四:树和二叉树树是一种重要的非线性数据结构,应用广泛。
在这个实验中,我学习了树的基本概念、存储结构和遍历方式。
实验中最困难的部分是二叉树的遍历。
数据结构实验报告总结反思引言在本学期的数据结构实验课程中,我们学习了各种常用的数据结构和算法,并进行了相应的实验操作。
通过实验,我们巩固了理论知识,并锻炼了自己的编程能力和问题解决能力。
在本次实验报告中,我将对我所学到的内容进行总结和反思,并讨论未来的学习计划和改进方法。
总结学习内容在实验课程中,我学习了以下数据结构和算法:1. 线性表:包括顺序表和链表,学会了它们的插入、删除和查找操作。
2. 栈和队列:熟悉了它们的特性和基本操作,并应用到实际问题中。
3. 二叉树:了解了树的定义和遍历方法,熟悉了二叉搜索树的操作。
4. 图:学习了图的基本概念和表示方法,实现了图的遍历和最短路径算法。
5. 排序算法:掌握了冒泡排序、选择排序、插入排序、快速排序等排序算法的原理和实现。
实验操作在每次实验中,我都认真阅读了实验指导书,并按照指导书上的要求进行了实验操作。
通过自己的努力,我成功地实现了实验要求,并得到了正确的结果。
实验操作中,我尽量养成了规范的编程习惯,包括良好的命名、合理的代码结构和注释等。
这有助于提高代码的可读性和可维护性。
实验收获通过实验,我对数据结构和算法有了更深入的理解,巩固了相关知识。
在实验过程中,我遇到了一些问题,并学会了解决它们。
同时,实验也锻炼了我的编程能力和解决问题的能力。
通过不断地思考和实践,我提高了自己的代码质量和效率,并学会了如何写出更优雅的代码。
反思遇到的问题在实验过程中,我遇到了一些问题,其中包括以下几点:1. 对于一些复杂的数据结构和算法,理解起来较为困难。
我需要花费更多的时间来学习和掌握这些内容。
2. 在某些情况下,实验指导书的说明不够清晰。
我需要仔细阅读并进行补充学习,以理解实验的要求和实现思路。
3. 在编写代码时,我有时会犯一些低级错误,比如数组越界、指针错误等。
我需要更加细心和谨慎地编写代码,以避免这些错误的发生。
改进方法为了提升自己的学习效果和编程能力,我计划采取以下改进方法:1. 增加学习时间。
摘要:本学期我完成的主要实验任务有:实验一对比算法的时空效率之裴波那契序列、实验二线性表及其应用之约瑟夫环、实验三栈和队列之算术表达式求值、实验四树和二叉树之层序遍历二叉树以及实验五排序之学生成绩统计程序,文档内容为对本学期的五次实验进行概要介绍、综合分析以及自我评价。
并且对本学期所写程序提供相关数据结构理论和对本课程的相关建议。
关键字:Data Structure数据结构stack栈tree 树binary tree二叉树queue 队列linear list线性表sort排序algorithm算法正文:实验开发环境及工具:1.软件环境:Microsoft Windows 7 旗舰英文版Microsoft Visual C++6.0编译器2.硬件环境:Genuine Intel(R) CPU U2700 @ 1.30GHz1.30GHz,1.86 GB 的内存320G硬盘(含隐藏分区)物理地址扩展郑重声明:本电脑无光驱,携带相当便捷重量:1.6kg(含电池)型号:Lenovo U350实验一实验名称:实验一对比算法的时空效率之裴波那契序列实验目的及要求:1.熟悉开发工具的编程环境。
2.体会算法和程序的不同。
3.学习用不同算法实现同一程序功能,并能熟练编程实现。
4.学习分析算法。
对比不同算法实现的效率有何不同,所占空间有何不同。
对比不同算法的优点和缺点。
实验主要内容:选题题目:试编写求k阶(k>=2)裴波那契序列的第m项值的不同算法,并编程实现。
k和m均以值调用的形式在函数参数中表现。
要求:至少用两种不同的算法(如,递推、递归等等)。
当k=2时,裴波那契序列的初始两项为0、1,此后序列的每个值都是前两项之和。
当k=3时,裴波那契序列的初始三项为0、0、1,此后序列的每个值都是前三项之和,以此类推。
概要设计和存储结构:k阶(k>=2)裴波那契序列的第m项值假设为temp[m]则temp[m]=temp[m-1]+temp[m-2]+……+temp[m-k]=temp[m-1]+temp[m-2]+……+temp[m-k]+temp[m-k-1]-temp[m-k-1]=temp[m-1]+{temp[m-2]+……+temp[m-k]+temp[m-k-1]}-temp[m-k-1]}=2*temp[m-1]- temp[m-k-1]采用线性表顺序结构——数组主要算法:通过temp[m]=2*temp[m-1]- temp[m-k-1]此公式采用了循环递推以及递推的方法得出结果。
数据结构实训报告总结在数据结构实训中,我们学习了各种常用的数据结构及其相关算法,并通过实践应用了这些知识。
本文将对实训内容进行总结,包括学习的主要内容、实践中遇到的问题以及所得到的收获和体会。
一、学习内容概述在实训中,我们学习了线性表、栈、队列、树、图等数据结构的基本概念和常用算法。
通过理论学习和实践编程,我们对这些数据结构的特点、操作和应用有了更深入的了解。
同时,我们还学习了算法的时间复杂度和空间复杂度的分析方法,能够对算法的效率进行评估和优化。
二、实践中遇到的问题及解决方案在实训过程中,我们遇到了一些问题,如如何选择合适的数据结构、如何设计高效的算法等。
针对这些问题,我们采取了以下解决方案:1. 选择合适的数据结构:根据问题的需求和特点,我们仔细分析了不同数据结构的优缺点,并选择了最合适的数据结构来解决问题。
例如,对于需要频繁插入和删除元素的场景,我们选择了链表作为数据结构。
2. 设计高效的算法:在解决问题时,我们注意算法的时间复杂度和空间复杂度,尽量选择高效的算法。
例如,在排序算法中,我们选择了快速排序算法,其时间复杂度为O(nlogn),比冒泡排序的O(n^2)要高效。
三、收获和体会通过这次实训,我们收获了以下几个方面的经验和体会:1. 理论联系实际:通过实践应用数据结构和算法,我们更加深入地理解了它们的实际应用。
我们发现,数据结构和算法是解决实际问题的重要工具,能够提高程序的效率和性能。
2. 团队合作能力:在实训过程中,我们需要与团队成员合作完成编程任务。
通过团队合作,我们学会了有效地分工合作、沟通协调,并通过相互学习和讨论提高了自己的编程能力。
3. 解决问题的能力:在实践中,我们遇到了各种问题,如代码bug、算法优化等。
通过不断思考和尝试,我们学会了独立解决问题的能力,并提高了自己的编程思维和调试技巧。
4. 抽象思维能力:在设计数据结构和算法时,我们需要进行抽象思维,将问题抽象为适合的数据结构和算法。
数据结构实训总结一、引言数据结构是计算机科学中的重要基础课程,通过学习数据结构可以匡助我们更好地理解和解决实际问题。
本文将对我在数据结构实训中所学到的知识和经验进行总结,并探讨实训对我的学习和职业发展的影响。
二、实训内容1. 实训目标本次数据结构实训旨在通过实际项目的实践,加深对数据结构的理解和应用能力。
具体目标包括:- 掌握常见数据结构的基本概念和操作;- 学习如何选择合适的数据结构解决实际问题;- 锻炼编程能力和解决问题的思维能力。
2. 实训项目实训项目是一个简单的学生管理系统,要求实现以下功能:- 添加学生信息;- 删除学生信息;- 修改学生信息;- 查询学生信息;- 排序学生信息。
三、实训经验1. 理论与实践结合在实训过程中,我发现理论知识和实践经验相辅相成。
通过实际操作,我更加深入地理解了数据结构的原理和应用场景。
同时,理论知识也为我解决实际问题提供了指导和思路。
2. 数据结构的选择在实训项目中,我需要选择合适的数据结构来存储学生信息。
根据不同的操作需求,我选择了以下数据结构:- 链表:用于存储学生信息,支持动态添加和删除;- 数组:用于存储学生信息,支持按照索引进行访问和修改;- 字典:用于存储学生信息,支持按照学号进行快速查找。
通过选择合适的数据结构,我能够高效地实现各种操作,并且提高了程序的性能。
3. 算法的优化在实训项目中,我注意到算法的优化对程序性能的影响非常重要。
通过对算法进行分析和改进,我成功地提高了程序的执行效率。
例如,在排序学生信息的功能中,我采用了快速排序算法,大大提高了排序的速度。
4. 团队合作实训项目是一个团队合作的过程。
在团队中,我与其他成员共同讨论问题、解决难题,提高了我的团队合作能力和沟通能力。
通过相互学习和交流,我不仅学到了更多的知识,还培养了解决问题的能力。
四、实训成果通过本次数据结构实训,我取得了以下成果:1. 熟练掌握了常见数据结构的基本概念和操作;2. 学会了如何选择合适的数据结构解决实际问题;3. 锻炼了编程能力和解决问题的思维能力;4. 提高了团队合作能力和沟通能力。
数据结构实训总结1. 引言数据结构是计算机科学中最基础、最重要的课程之一。
通过实训课程的学习和实践,我对数据结构的理论知识有了更深入的了解,并且在实际项目中应用这些知识,提高了我的编程能力和问题解决能力。
本文将总结我在数据结构实训中的学习经验和收获。
2. 实训内容2.1 实训目标本次数据结构实训的目标是通过实践掌握常见的数据结构,包括线性表、栈、队列、树和图等,并能够灵便运用这些数据结构解决实际问题。
2.2 实训任务在实训过程中,我们完成为了以下任务:- 实现线性表的顺序存储结构和链式存储结构,并比较它们的优缺点。
- 实现栈和队列的顺序存储结构和链式存储结构,并掌握它们的应用场景。
- 实现二叉树的链式存储结构和遍历算法,包括前序遍历、中序遍历和后序遍历。
- 实现图的邻接矩阵表示和邻接表表示,并掌握图的遍历算法,如深度优先搜索和广度优先搜索。
3. 实训经验和收获3.1 理论知识与实践结合通过实训课程,我深刻体味到理论知识与实践的结合是学习数据结构的有效途径。
在实际项目中应用数据结构,我更加理解了数据结构的本质和作用,加深了对数据结构的理解。
3.2 问题解决能力的提升在实训过程中,我们遇到了许多问题,如算法设计、数据结构选择和程序调试等。
通过解决这些问题,我提高了自己的问题解决能力和调试技巧,学会了从多个角度思量和分析问题,并找到最优的解决方案。
3.3 团队合作意识的培养在实训项目中,我们需要与同学合作完成任务,包括代码编写、测试和调试等。
通过团队合作,我学会了与他人沟通、协调和分工合作,培养了团队合作意识和能力。
4. 实训成果展示在实训过程中,我完成为了以下成果:- 实现了线性表的顺序存储结构和链式存储结构,并比较了它们的优缺点。
- 实现了栈和队列的顺序存储结构和链式存储结构,并了解了它们的应用场景。
- 实现了二叉树的链式存储结构和遍历算法,包括前序遍历、中序遍历和后序遍历。
- 实现了图的邻接矩阵表示和邻接表表示,并掌握了图的遍历算法,如深度优先搜索和广度优先搜索。
数据结构实验学期总结摘要:本学期我完成的主要实验任务有:裴波那锲序列、约瑟夫环、表达式求值、赫夫曼编码文档内容:本学期以来,我所完成的所有实验及其总结,分别包括实验名称、实验目的及要求、实验主要内容、实验结果结论、实验分析,还有我对该课程学习总结和建议。
关键字:数据结构实验总结数组链表栈二叉树实验一实验名称:裴波那锲序列实验目的及要求:1. 熟悉开发工具的编程环境。
2. 体会算法和程序的不同。
3. 学习用不同算法实现同一程序功能,并能熟练编程实现。
4. 学习分析算法。
对比不同算法实现的效率有何不同,所占空间有何不同。
对比不同算法的优点和缺点实验主要内容:概要设计和存储结构K阶(k>=2)裴波那契序列的第m项值假设为sum,则: sum(m) =sum(m-1)+sum(m-2)+……+sum(m-k)=sum(m-1)+sum(m-2)+……+sum(m-k)+sum(m-k-1)-sum(m-k-1)=sum(m-1)+[sum(m-2)+……+sum(m-k)+sum(m-k-1)]-sum(m-k-1)=2*sum(m-1)-sum(m-k-1)所以最后return返回的是2*f(m-1,k)-f(m-k-1,k),如此便实现了裴波那契序列第m 项的计算。
下面程序段中@语句的时间复杂度为:O(sum)=2(m-k) (m>k) 程序中未曾使用线性表或链表结构主要算法int f(int m,int k){ if(m<=k-1) return 0;else if(m==k+1||m==k) return 1;@ else return (2*f(m-1,k)-f(m-k-1,k)); } //f( )函数实现裴波那契序列实验结果和结论实验分析:通过建立一个f( )函数,用递归的方式来实现第m 项输出的值,本次程序的设计因为采用了递归调用,所以速度相对比非递归要慢了些。
实验二实验通过三组数据的测试,基本实现了实验要求的功能,经过几次的修改后,自己没有再发现什么bug 了,感觉还是很满意的实验名称:约瑟夫环实验目的及要求:通过实习题的上机实践,帮助学生掌握线性表的基本操作在两种存储结构上算法的实现,特别是链表,实验以各类链表的操作和应用作为重点。
采用循环单链表作为存储结构,按照出列的顺序打印出各人的编号实验主要内容:概要设计和存储结构分三个模块:自主定义的二个函数以及一个主函数Creat函数目的在于建立一个循环链表Count是实现本程序所要求的主要功能而主函数main通过依次调用以上函数完成程序Struct huan* creat (int n) 是用于构建一个单循环动态链表,通过malloc 开辟一个结构体结点,在main()中通过由循环语句for将其连接成一个循环链表struct huan{int num;int data;struct huan *next;};定义的结构体形式Struct huan* creat (int n) 创建一个单循环链表,目的用来存放人的位置及密码void count(struct huan* head,int n) 实现约瑟夫环的功能 主要算法struct huan* creat(int n){//创建一个单循环链表,目的用来存放人的位置及密码struct huan* head;if((head=(struct huan*)malloc(sizeof(struct huan)))==NULL) return NULL;head->num=n;//可以替换下一句head->data=rand()%100+1;密码随机产生scanf("%d",&head->data);return head;}//creat/*实现出列功能*/void count(struct huan* head,int n){struct huan *p2=head,*p1;for(;p2->next!=head;p2=p2->next);p1=p2->next;int code;printf("\n请输入起始密码:\n");scanf("%d",&code);int pas=code%n;printf("出列次序:\n位置密码\n");while(n>1){if(pas==0) pas=n;for(int i=1;i<pas;p2=p1,p1=p1->next,i++);p2->next=p1->next;printf(" %d\t%d\n",p1->num,p1->data);code=p1->data;free(p1);p1=p2->next;n--;pas=code%n;}printf(" %d\t%d\n",p1->num,p1->data);free(p1);}//count实验结果和结论实验要求完成的功能已经全部完成了,但是对于手动输入密码和随机产生密码这两种功能没能够通过程序选择来完成实验分析:可以看出这一题是考查单链表的应用,而且这一题中的循环单链表是不需要“头结点”的,要注意空表和非空表的界限。
程序运行后要求用户指定初始报数上界值,人数及各人的密码。
可先设n≤30。
实验三实验名称:表达式求值实验目的及要求:通过上机实践掌握队列和栈的顺序存储结构和链式存储结构,以便我们能在相应的应用问题中正确选用它们;掌握栈和队列的特点,即先进后出与先进先出的原则;掌握栈和队列的基本运算,如入栈和出栈、入队与出队等运算在顺序存储结构和链式存储结构上的实现。
以字符序列形式从终端输入语法正确的、不含变量的整数表达式。
利用课本3.2.5节中给出的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照课本上的例子演示在求值过程中运算符栈、运算数栈、输入字符和主要操作的变化过程。
实验主要内容:概要设计和存储结构构建了两个栈OPTR, OPND(OPTR为运算符栈,OPND为运算数栈)typedef struct{ElemType *base;ElemType *top;int stacksize;}Stack;//定义栈类型int IfEmptyStack(Stack S);//判断栈是否为空void InitStack(Stack &S);//构建一个栈void EmptyStack(Stack &S);//栈空时,则返回值void Push(Stack &S, ElemType e); //插入元素e为新的栈顶元素void Pop(Stack &S, ElemType &e); //若栈不空,则删除s的栈顶元素,用e 返回其值void ShowStack(Stack S); //输出计算结果int In(char ch); //判断字符ch是不是运算符char Precede(char a,char b);//判定运算符栈顶运算符a与读入b之间优先权int Operate(int a, char f, int b); //进行二元运算的函数void EvaluateExpression();//算术表达式求值的算符优先算法main函数调用EvaluateExpression,EvaluateExpression嵌套调用以上各函数 主要算法int IfEmptyStack(Stack S) {//判断栈是否为空,是则返回1,否则返回0if(S.base==S.top)return 1;return 0;}void InitStack(Stack &S) {//构建一个空栈sS.base=(ElemType*)malloc(STACK_INIT_SIZE*si zeof(ElemType));S.top=S.base;S.stacksize=STACK_INIT_SIZE ;return ;}void EmptyStack(Stack &S) {//若栈为空,则返回值S.top=S.base; return ;}void Push(Stack &S, ElemType e){//插入元素e为新的栈顶元素if(S.top-S.base>=S.stacksiz e){//栈满,追加存储空间S.base=(ElemType*)realloc(S .base,(S.stacksize+S TACKINCREMENT)*sizeof(ElemT ype));S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT ;}*S.top++=e;return ;}//Pushvoid Pop(Stack &S, ElemType &e){//若栈不空,则删除s的栈顶元素,用e返回其值if(S.top==S.base)return ;e=*--S.top;return ;}ElemType GetTop(Stack &S) {//栈不空,返回栈顶元素if(S.top==S.base)return 0;return *(S.top-1);}void ShowStack(Stack S){//输出计算结果ElemType *p=S.base;while(p!=S.top)printf("%d",*p++);return;} int In(char ch){//判断字符ch是不是运算符int res;switch(ch){case '+':case '-':case '*':case '/':case '(':case ')':case '=': res=1;break; default: res=0;break;}return res;}char Precede(char a, char b) {//判定运算符的栈顶运算符a 与读入b之间优先权int i,j;int OP[7][7]={{1,1,-1,-1,-1,1,1},{1,1,-1,-1,-1,1,1},{1,1,1,1,-1,1,1},{1,1,1,1,-1,1,1},{-1,-1,-1,-1,-1,0,2},{1,1,1,1,2,1,1},{-1,-1,-1,-1,-1,2,0}};switch(a){case '+':i=0;break;case '-':i=1;break;case '*':i=2;break;case '/':i=3;break;case '(':i=4;break;case ')':i=5;break;case '=':i=6;break;}switch(b){case '+':j=0;break;case '-':j=1;break;case '*':j=2;break;case '/':j=3;break;case '(':j=4;break;case ')':j=5;break;case '=':j=6;break;}if(OP[i][j]==1)return '>';else if(OP[i][j]==-1)return '<';else if(OP[i][j]==2){ printf("表达式输入错误!\n");system("pause");exit (0);}else if(OP[i][j]==0)return '=';}//Precedeint Operate(int a, char f, int b){//进行二元运算的函数switch(f){case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; }return 0;}//Operatevoid EvaluateExpression() {//算术表达式求值的算符优先算法char c, d[100];int i, f,num, tmpa, tmpb; Stack OPTR, OPND;//OPTR为运算符栈,OPND为运算数栈InitStack(OPTR);InitStack(O PND);Push(OPTR, '=');c=getchar();while(c!='='||GetTop(OPTR)!='='){if(c>='0'&&c<='9'){i=0;do{d[i++]=c;c=getchar();}while(c>='0'&&c<='9');d[i]='\0';num=atoi(d);Push(OPND, num);}//ifelse if(In(c)){switch(Precede(GetTop(OPTR), c)){case '<': Push(OPTR, (int)c);c=getchar(); break; case '=': Pop(OPTR, f);c=getchar(); break;case '>': Pop(OPTR, f);Pop(OPND, tmpb);Pop(OPND, tmpa);Push(OPND, Operate(tmpa, f, tmpb));break;}//switch}//else if}//whilec=getchar();//接收最后输入的一个回车符,否则在主函数中只能输入一次printf("计算结果为: ");ShowStack(OPND);printf("\n");}//EvaluateExpression所有的运算数都定义为整型,运算符定义为字符型实验结果和结论程序在表达式输入错误即括号不相匹配时能够报错了,并结束程序。