算术表达式与二叉树课程设计
数据结构课程设计:算术表达式
数据结构课程设计:算术表达式表达式求值⼀⽬的利⽤《数据结构》课程的相关知识完成⼀个具有⼀定难度的综合设计题⽬,利⽤C/C++语⾔进⾏程序设计,并规地完成课程设计报告。
通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决⽅法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提⾼利⽤计算机分析解决综合性实际问题的基本能⼒。
设计⼀个程序,演⽰以字符序列的形式输⼊不含变量的实数表达式求值的计算结果⼆需求分析设计⼀个程序,演⽰以字符序列的形式输⼊不含变量的实数表达式求值的计算结果。
对于这个程序我们从输⼊,输出,和功能三⽅⾯来分析。
1.程序输⼊:从键盘上输⼊表达式,⼀个算术表达式,由常量、运算符和括号组成(以字符串形式输⼊,不含变量)。
为了简化,操作数只能为浮点数,操作符为“ +”、“-”、“*”、“/”、“(”、“)”,⽤“#“表⽰结束。
2.程序输出:表达式运算结果,运算符栈、运算数栈、输⼊字符和主要操作变化过程,如运算符栈、运算数栈的出⼊记录,字符出⼊栈的过程,打印出完整的过程。
3.功能要求及说明:从键盘上输⼊表达式。
分析该表达式是否合法(包含分母不能为零的情况):(1)是数字,则判断该数字的合法性。
(2)是规定的运算符,则根据规则进⾏处理。
在处理过程中,将计算该表达式的值。
(3)若是其它字符,则返回错误信息。
若上述处理过程中没有发现错误,则认为该表达式合法,并打印处理结果。
三概要设计1.数据结构的选择:任何⼀个表达式都是由操作符,运算符和界限符组成的。
我们分别⽤顺序栈来寄存表达式的操作数和运算符。
栈是限定于紧仅在表尾进⾏插⼊或删除操作的线性表。
为了实现算符优先算法,可以使⽤两个⼯作栈。
⼀个称做SqStack1,⽤以寄存运算符;另⼀个称做SqStack2,⽤以寄存操作数或运算结果。
⾸先置操作数栈为空栈,表达式起始符“#”作为运算符栈的栈底元素,然后依次读⼊表达式的每个字符,若是操作数则进⼊SqStack2栈,若是运算符则和SqStack1栈的栈顶运算符⽐较优先权后做相应操作,直⾄整个表达式求值完毕。
C语言实现一.二叉树操作 二.用栈实现算术表达式求值 课设报告
沈阳理工大学课程设计专用纸
No. 1
题目 一.二叉树操作(1)二.算术表达式求
一、课程设计的目的
本学期我们对《数据结构》这门课程进行了学习。这门课程是一门实践性非常强的 课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设 计实习。这次课程设计不但要求学生掌握《数据结构》中的各方面知识,还要求学生具 备一定的 C 语言基础和编程能力。
{ int k; char *temp; if(len<=0) { *T=NULL;
沈阳理工大学
沈阳理工大学课程设计专用纸
No. 5
return; } *T=(BitNode*)malloc(sizeof(BitNode)); (*T)->data=*pre; for(temp=in;temp<in+len;temp++)
int h,lh,rh; if(T==NULL)
h=0; else {
lh=Depth(T->lchild); rh=Depth(T->rchild); if(lh>=rh)
h=lh+1; else
h=rh+1; } return h; }
沈阳理工大学
沈阳理工大学课程设计专用纸
No. 6
4、运行结果 先输入一棵树的先序遍历序列和中序遍历序列,然后构造出这颗二叉树,并输
(2)题目二的内容和要求: 1、算术表达式由操作数、运算符和界限符组成。操作数是正整数,运算符为 加减乘除,界限符有左右括号和表达式起始 2、将一个表达式的中缀形式转化为相应的后缀形式 3、依据后缀表达式计算表达式的值
沈阳理工大学
沈阳理工大学课程设计专用纸
算术表达式与二叉树课程设计
山西大学课程设计任务书设计题目算术表达式与二叉树所属课程:数据结构系别软件学院专业软件工程班级软工1408班姓名霍志斌指导教师李雪梅设计任务下达日期 2015年 12 月15 日设计时间2016年1月4日至 2016年1月8日目录:一、需求分析二、概要设计1、数据类型的声明:2、表达式的抽象数据类型定义3、整体设计三、详细设计1、二叉树的存储类型2、顺序栈的存储类型3、表达式的基本操作4、主程序和其他伪码算法5、函数的调用关系四、设计和调试分析五、测试六、课程设计的心得和心得以及问题一、需求分析【课程设计要求】【问题的描述】一个表达式和一棵二叉树之间,存在着自然的对应关系。
写一个程序,实现基于二叉树表示的算术表达式Expression的操作。
【基本要求】假设算术表达式Expression内可以含有变量(a-z),常量(0-9)和二元运算符(+,-,*,/,^(乘幂))。
实现以下操作:(1)ReadExpr(E)――以字符序列的形式输入语法正确的前缀表达式并构造表达式E。
(2)WriteExpr(E)――用带括号的中缀表达式输出表达式E。
(3)Assign(V,c)――实现对变量V的赋值(V=c),变量的初值为0。
(4)Value(E)――对算术表达式E求值。
(5)CompoundExpr(p,E1,E2)――构造一个新的复合表达式(E1)p(E2)。
【测试数据】1)分别输入0;a;-91;+a*bc;+*5x2*8x;+++*3^*2^x2x6并输出。
2)每当输入一个表达式后,对其中的变量赋值,然后对表达式求值。
二、概要设计1、数据类型的声明:在这个课程设计中,采用了链表二叉树的存储结构,以及两个顺序栈的辅助存储结构/*头文件以及存储结构*/#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<string.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW 0typedef int Status;2、表达式的抽象数据类型定义ADT Expression{数据对象D:D是具有数值的常量C和没有数值的变量V;数据关系:R={<(V或者C)P(V或者C)>|V,C∈D, <(V或者C)P(V或者C)>表示由运算符P结合起来的表达式E}基本操作:Status Input_Expr(&string,flag)操作结果:以字符序列的形式输入语法正确的前缀表达式,保存到字符串string;参数flag表示输出的提示信息是什么,输入成功返回OK,否则,返回ERROR。
二叉树课程设计报告
一、设计目标二叉树是形象地说既树中每个节点最多只有两个分支,它是一中重要的数据类型。
可以运用于建立家谱,公司所有的员工的职位图,以及各种事物的分类和各种机构的职位图表。
二叉树是通过建立一个链式存储结构,达到能够实现前序遍历,中序遍历,后序遍历。
以及能够从输入的数据中得知二叉树的叶子结点的个数,二叉树的深度。
在此,二叉树的每一个结点中必须包括:值域,左指针域,右指针域。
二、总体设计1.对程序中定义的核心数据结构及对其说明:typedef struct BiTNode{//创建二叉树char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;在开头定义了二叉树的链式存储结构,此处采用了每个结点中设置三个域,即值域,左指针域和右指针域。
2.模块的划分及其功能:本程序分为:7大模块。
二叉树的建立链式存储结构、前序遍历、求叶子结点的个数计算、中序遍历、后序遍历、深度、主函数。
1、二叉树的建立链式存储结构;首先typedef struct BiTNode:定义二叉树的链式存储结构,此处采用了每个结点中设置三个域,即值域,*lchild:左指针域和rchild:右指针域。
2、二叉树的前序遍历;利用二叉链表作为存储结构的前序遍历:先访问根结点,再依次访问左右子树。
3、二叉树的求叶子结点的个数计算;先分别求得左右子树中各叶子结点的个数,再计算出两者之和即为二叉树的叶子结点数。
4、二叉树的中序遍历;利用二叉链表作为存储结构的中序遍历:先访问左子数,再访问根结点,最后访问右子树。
5、二叉树的后序遍历;利用二叉链表作为存储结构的前序遍历:先访问左右子树,再访问根结点。
6、求二叉树的深度:首先判断二叉树是否为空,若为空则此二叉树的深度为0。
否则,就先别求出左右子树的深度并进行比较,取较大的+1就为二叉树的深度。
7、主函数。
核心算法的设计:二叉树是n个节点的有穷个集合,它或者是空集(n=0),或者同时满足以下两个条件:(1):有且仅有一个称为根的节点;(2):其余节点分为两个互不相交的集合T1,T2,并且T1,T2都是二叉树,分别称为根的左子树和右子树。
二叉树教案
二叉树教案一、教学目标:1.了解二叉树的定义和性质。
2.学会二叉树的遍历算法(前序遍历、中序遍历、后序遍历)。
3.掌握二叉树的基本操作(创建二叉树、插入节点、删除节点)。
二、教学重点和难点:1.二叉树的定义和性质。
2.二叉树的遍历算法。
3.二叉树的基本操作。
三、教学准备:1.教师准备:PPT、计算机、投影仪。
2.学生准备:课前预习、纸笔。
四、教学过程:Step 1 导入新课教师通过提问的方式,引导学生回顾树的基本概念,并激发学生对二叉树的兴趣。
Step 2 二叉树的定义和性质教师给出二叉树的定义,并带领学生讨论二叉树的性质(每个节点最多有两个子节点,左子树和右子树)。
Step 3 二叉树的遍历算法1.前序遍历:先访问根节点,然后递归遍历左子树,再递归遍历右子树。
2.中序遍历:先递归遍历左子树,然后访问根节点,再递归遍历右子树。
3.后序遍历:先递归遍历左子树,然后递归遍历右子树,最后访问根节点。
Step 4 二叉树的基本操作1.创建二叉树:教师通过示例向学生展示二叉树的创建过程。
2.插入节点:教师通过示例向学生展示如何插入节点,并解释插入节点的规则。
3.删除节点:教师通过示例向学生展示如何删除节点,并解释删除节点的规则。
Step 5 练习与拓展1.教师设计练习题,让学生运用所学知识进行练习。
2.鼓励学生拓展二叉树的其他应用领域,并进行讨论。
五、教学反思本节课通过讲解二叉树的定义和性质,以及二叉树的遍历算法和基本操作,使学生对二叉树有了基本的了解和掌握。
通过练习和拓展,巩固了学生的学习成果,并培养了学生的分析和解决问题的能力。
但是,由于时间有限,学生的实际操作机会较少,可以在课后布置相关的作业,加深学生的理解和应用能力。
基于二叉树的算术表达式计算与实现
&x ) Is ) {
it p s = 0z n o l B N T o d e { 1c h ild =
gt o et+x l ps) e d(r is , O1; N s ) B N e* o T O r t= gt oe t ps, d o e d (r ol N s+ I s) x 1; )
d t SrCU ,t r r e o sl i s f r c n et g aa tU tr e e h e ae sl m o t n o ov r i d uo n
a i me i e pes n t b a y t e . T i p p r d c s s r h t x rs 0 i re t c  ̄ n r h a e i us s s e
/^\ \
() +2 -)4 b 5 ( 32
igtr ryro- ot f e i i ( t > pr ( P ot o ) > gtr fyn e > pr e ii (o - ot) P ot d ) {
n o d e — — >lhl =r o ; c id o t n o d e — —
{ p s+ 1 o = ;
基于二叉树的算术表达 式计算 与实现
E a u to f a i me i e p e so a e n b n r r e v l a in o r h t t c x r s i n b s d o i a y te
r u n NU L e r L ; t } eefc= \ ’ IUT NU L l ( =’0)  ̄ I L ; s h L I
/^ \
1 + 1 1
/\
r5 i 女
w i( oe gt oe t ps ,I1 hl(d = e d (r olp S en N s+ 3 ) ) ) {
数据结构实验二叉树
实验六:二叉树及其应用一、实验目的树是数据结构中应用极为广泛的非线性结构,本单元的实验达到熟悉二叉树的存储结构的特性,以及如何应用树结构解决具体问题。
二、问题描述首先,掌握二叉树的各种存储结构和熟悉对二叉树的基本操作。
其次,以二叉树表示算术表达式的基础上,设计一个十进制的四则运算的计算器。
如算术表达式:a+b*(c-d)-e/f三、实验要求如果利用完全二叉树的性质和二叉链表结构建立一棵二叉树,分别计算统计叶子结点的个数。
求二叉树的深度。
十进制的四则运算的计算器可以接收用户来自键盘的输入。
由输入的表达式字符串动态生成算术表达式所对应的二叉树。
自动完成求值运算和输出结果。
四、实验环境PC微机DOS操作系统或Windows 操作系统Turbo C 程序集成环境或Visual C++ 程序集成环境五、实验步骤1、根据二叉树的各种存储结构建立二叉树;2、设计求叶子结点个数算法和树的深度算法;3、根据表达式建立相应的二叉树,生成表达式树的模块;4、根据表达式树,求出表达式值,生成求值模块;5、程序运行效果,测试数据分析算法。
六、测试数据1、输入数据:2.2*(3.1+1.20)-7.5/3正确结果:6.962、输入数据:(1+2)*3+(5+6*7);正确输出:56七、表达式求值由于表达式求值算法较为复杂,所以单独列出来加以分析:1、主要思路:由于操作数是任意的实数,所以必须将原始的中缀表达式中的操作数、操作符以及括号分解出来,并以字符串的形式保存;然后再将其转换为后缀表达式的顺序,后缀表达式可以很容易地利用堆栈计算出表达式的值。
例如有如下的中缀表达式:a+b-c转换成后缀表达式为:ab+c-然后分别按从左到右放入栈中,如果碰到操作符就从栈中弹出两个操作数进行运算,最后再将运算结果放入栈中,依次进行直到表达式结束。
如上述的后缀表达式先将a 和b 放入栈中,然后碰到操作符“+”,则从栈中弹出a 和b 进行a+b 的运算,并将其结果d(假设为d)放入栈中,然后再将c 放入栈中,最后是操作符“-”,所以再弹出d和c 进行d-c 运算,并将其结果再次放入栈中,此时表达式结束,则栈中的元素值就是该表达式最后的运算结果。
二叉排序树课程设计
二叉排序树课程设计一、课程目标知识目标:1. 学生能够理解二叉排序树的基本概念和性质,掌握其结构特点和应用场景。
2. 学生能够掌握二叉排序树的插入、删除和查找操作,并了解其时间复杂度。
3. 学生能够理解二叉排序树与其他排序算法的关系,了解其在排序中的应用。
技能目标:1. 学生能够运用所学知识,独立构建二叉排序树,并实现插入、删除和查找功能。
2. 学生能够分析二叉排序树的性能,对其进行优化,提高排序效率。
3. 学生能够运用二叉排序树解决实际问题,如数据排序、查找等。
情感态度价值观目标:1. 学生通过学习二叉排序树,培养对数据结构和算法的兴趣,提高解决问题的能力。
2. 学生在学习过程中,学会合作、交流,培养团队精神和共享意识。
3. 学生能够认识到二叉排序树在实际应用中的价值,激发对计算机科学的热爱。
本课程针对高中年级学生,课程性质为理论与实践相结合。
在教学过程中,注重启发式教学,引导学生主动探究、实践。
根据学生特点和教学要求,课程目标具体、可衡量,以便学生和教师能够清晰地了解课程的预期成果。
课程目标的分解为具体的学习成果,为后续的教学设计和评估提供依据。
二、教学内容1. 引入二叉排序树的概念,讲解其定义、性质和基本操作。
- 理解二叉树的基础知识,回顾二叉树的遍历方法。
- 介绍二叉排序树的定义,阐述其特点及应用场景。
- 分析二叉排序树的性质,如二叉排序树的中序遍历结果为有序序列。
2. 探讨二叉排序树的构建、插入、删除和查找操作。
- 讲解二叉排序树的构建方法,学会从无序数据建立二叉排序树。
- 分析插入、删除和查找操作的步骤,理解它们的时间复杂度。
- 举例说明如何利用二叉排序树实现数据排序和查找。
3. 分析二叉排序树的性能及优化方法。
- 探讨二叉排序树的高度、平衡因子等性能指标。
- 介绍常见的优化方法,如平衡二叉树(AVL树)和红黑树。
4. 实践环节:二叉排序树的应用。
- 设计实践题目,让学生动手实现二叉排序树的基本操作。
第四章-树和二叉树-说课教案
第五章树和二叉树说课教案姓名:仇环单位:信息工程系年级与科目:08级计算机应用《数据结构》课题:树和二叉树职称:讲师教龄:1年(各位老师下午好,我说课的题目是树和二叉树)说课的内容包括:一.教学大纲分析二.教材分析三、学情分析四.教学目标五、教学重点与难点六、教学方法七、教学过程八、教学效果预测及教学后记一、教学大纲分析:高职高专教育的人才培养特征是高级技术应用型人才,具体到计算机专业来说,就是培养从事计算机产品生产、维修和编程和实际应用的技术人才。
在计算机专业的课程体系中,《数据结构》不仅是一门重要的专业基础课程,而且是计算机程序设计重要的理论基础,更是计算机等级、专升本等考试的必考课程之一。
它在整个学科体系中具有重要作用,有着不可替代的地位。
本课程的教学不仅重视学生对理论知识的理解和掌握,锻炼学生抽象思维能力和想象能力,更注重实践动手的能力,要求学生能够设计出结构清晰、可读性好、运行效率高的算法,并能够用一种或多种计算机高级程序设计语言实现。
学好这门课程,对培养学生程序设计的能力、设计算法的能力和运用计算机进行数据处理的能力有着深远的意义。
其前导课程为:《C语言程序设计》或《C++语言》。
二、教材分析本教材属于“21世纪高职高专规划教材”,这套教材主要面向高职高专院校学生。
教材内容力求体现以应用为主体,强调理论知识的理解和运用,实现专科教学以实践体系及技术应用能力培养为主的目标。
1、教材特点:本教材的特点可总结为:(1)基础理论知识的阐述由浅入深、通俗易懂。
内容的组织和编排以应用为主线,省略了一些理论推导和数学证明过程,淡化了算法的设计分析和复杂的时空分析。
(2)各章都配有应用举例,列举分析了很多实用的例子,且大多数算法都直接给出了相应的C语言程序,以便上机练习和实践。
(3)便于复习和掌握每章的重点,每章的起始处都给出了要点,并在每章结尾处给出了小结。
2、教材内容:本书共分为8章。
第一章叙述数据、数据结构、算法等基本概念。
简单算术表达式的二叉树的构建和求值
一、概述二、算术表达式的二叉树表示1. 什么是二叉树2. 算术表达式的二叉树表示方法三、算术表达式二叉树的构建1. 中缀表达式转换为后缀表达式2. 后缀表达式构建二叉树四、算术表达式二叉树的求值五、应用举例六、总结一、概述在数学和计算机科学中,处理算术表达式是一个常见的问题。
在计算机中,算术表达式通常以中缀、前缀或后缀的形式出现,其中中缀表达式最为常见。
而采用二叉树来表示和求解算术表达式,是一种常见且高效的方法。
二、算术表达式的二叉树表示1. 什么是二叉树二叉树是一种树形数据结构,它的每个节点最多只能有两个子节点,分别是左子节点和右子节点。
二叉树可以为空,也可以是非空的。
2. 算术表达式的二叉树表示方法在二叉树中,每个节点要么是操作符,要么是操作数。
操作符节点的左子节点和右子节点分别表示运算符的两个操作数,而操作数节点则不包含任何子节点。
通过这种方式,可以将算术表达式表示为一个二叉树结构。
三、算术表达式二叉树的构建1. 中缀表达式转换为后缀表达式为了构建算术表达式的二叉树,首先需要将中缀表达式转换为后缀表达式。
中缀表达式是人们常见的形式,例如"2 + 3 * 5",而后缀表达式则更适合计算机处理,例如"2 3 5 * +"。
将中缀转后缀的算法即为中缀表达式的后缀转换法则。
2. 后缀表达式构建二叉树构建二叉树的过程通常采用栈来辅助完成。
从左到右扫描后缀表达式,对于每个元素,如果是操作数,则入栈;如果是操作符,则弹出栈顶两个元素作为其左右子节点,然后将操作符节点入栈。
最终栈中只剩一个节点,即为构建的二叉树的根节点。
四、算术表达式二叉树的求值算术表达式二叉树的求值是递归进行的。
对于二叉树的每个节点,如果是操作符节点,则递归求解其左右子节点的值,并进行相应的操作;如果是操作数节点,则直接返回其值。
最终得到根节点的值,即为整个算术表达式的值。
五、应用举例以中缀表达式"2 + 3 * 5"为例,首先将其转换为后缀表达式"2 3 5 * +",然后根据后缀表达式构建二叉树,最终求得二叉树的根节点即为算术表达式的值。
二叉搜索树课程设计
二叉搜索树课程设计一、课程目标知识目标:1. 学生能理解二叉搜索树的定义、性质和基本操作。
2. 学生能掌握二叉搜索树的插入、删除和查找算法。
3. 学生能了解二叉搜索树的中序遍历、前序遍历和后序遍历算法。
技能目标:1. 学生能运用所学知识,实现二叉搜索树的构建和操作。
2. 学生能通过编程实践,解决与二叉搜索树相关的问题。
3. 学生能分析二叉搜索树在实际应用中的优缺点,并进行优化。
情感态度价值观目标:1. 学生培养对数据结构和算法的兴趣,增强计算机科学素养。
2. 学生培养团队协作意识,学会与他人共同解决问题。
3. 学生通过学习二叉搜索树,认识到数据结构在实际应用中的重要性,激发学习动力。
课程性质:本课程为计算机科学领域的数据结构与算法课程,以二叉搜索树为研究对象,结合编程实践,提高学生的数据分析和问题解决能力。
学生特点:学生已具备基本的编程能力,对数据结构有一定了解,但可能对二叉搜索树的具体应用和实现细节掌握不足。
教学要求:注重理论与实践相结合,通过讲解、示例、编程实践等环节,使学生掌握二叉搜索树的相关知识,提高编程能力。
同时,关注学生的情感态度价值观培养,激发学习兴趣。
在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. 二叉搜索树的定义及性质- 理解二叉搜索树的定义- 掌握二叉搜索树的性质:左子树所有节点小于根节点,右子树所有节点大于根节点2. 二叉搜索树的插入、删除和查找操作- 学习插入算法,包括递归和非递归实现- 学习删除算法,包括三种情况的处理:删除叶子节点、删除只有一个子节点的节点、删除有两个子节点的节点- 学习查找算法,掌握如何在二叉搜索树中查找特定值3. 二叉搜索树的遍历算法- 学习中序遍历、前序遍历和后序遍历的原理及实现- 分析遍历算法在实际应用中的用途4. 二叉搜索树的应用及优化- 探讨二叉搜索树在实际编程中的应用场景- 分析二叉搜索树的性能,了解平衡二叉搜索树的概念及优势5. 编程实践- 结合教材,完成二叉搜索树的构建、插入、删除、查找等操作的编程实践- 实现二叉搜索树的中序、前序、后序遍历算法- 分析编程实践中遇到的问题,进行优化和改进教学内容安排和进度:第一课时:二叉搜索树的定义及性质,插入算法第二课时:删除算法,查找算法第三课时:遍历算法,应用及优化第四课时:编程实践与讨论教材章节关联:《数据结构与算法分析》第四章:二叉树《算法导论》第三章:二叉树和红黑树三、教学方法1. 讲授法:- 采用引导式讲授,通过问题驱动的形式,激发学生对二叉搜索树知识的探究欲望。
二叉排序树及其应用(算法与数据课程设计)
二叉排序树及其应用一、问题描述二叉排序树又称二叉查找树,是一种动态的树表,在现实中有着广泛的应用。
选择合适的存储结构,建立二叉排序树,完成插入、删除等基本操作。
并在此基础上,将二叉排序树应用于通讯录的管理。
二、基本要求1. 选择合适的存储结构实现二叉排序树的建立。
2. 完成二叉排序树的遍历、搜索、插入、删除等操作。
3. 编写应用程序,运用二叉排序树实现通讯录管理。
三、测试数据1、二叉排序树建立二叉排序树:“49 38 76 97 13 27 55”在建立树中搜索:15和13在建立树中插入:5在建立树中删除:272、通讯录的测试数据"小雨",1314520"老赵",3344520"一辛",1314025"华仔",3344025"落落",1234567"小钰",3142267"瑞",4384383"大黄",7654321。
在上表的基础上完成二叉排序树的建立、插入、删除。
四、算法思想1、二叉排序树的查找,即给定值先与根结点比较,若相等则查找成功,否则根据根据他们之间的大小关系,分别在左子树或右子树查找。
2、二叉排序树的插入,插入的一定是叶子结点,根据查找结果决定插入位置。
3、二叉排序树的删除分三种情况:1)若*p结点为叶子结点,即P L和P R均为空树。
由于删除叶子结点不破坏整棵树的结构,则只需改其双亲结点的指针即可。
2)若*p结点只有左子树P L或者只有右子树P R,此时只要令P L或P R直接成为其双亲结点*f的左子树即可。
3)若*p的左右子树均不空。
令*p的左子树为*s的左子树,*p的右子树为*s的右子树,如图。
4、在通讯录管理系统的设计中都基于上述二叉排序树的思想。
五、模块化分1.二叉排序树1).Search(p,data)查找二叉排序树中元素。
二叉树的课程设计
课程设计任务书摘要针对现实世界中许多关系复杂的数据,如人类社会的家谱,各种社会组织机构,博弈交通等复杂事物或过程以及客观世界中广泛存在的具有分支关系或层次特性的对象.如操作系统的文件构成、人工智能和算法分析的模型表示以及数据库系统的信息组织形式等,用线性结构难以把其中的逻辑关系表达出来,必须借助于数和图这样的非线性结构,因此在以模拟客观世界问题,解决客观世界问题为主要任务的计算机领域中树型结构是信息的一种重要组织形式,树有着广泛应用。
在树型结构的应用中又以二叉树最为常用。
二叉树是一种非常重要的非线性结构,所描述的数据有明显的层次关系,其中的每个元素只有一个前驱,二叉树是最为常用的数据结构,它的实际应用非常广泛,二叉树的遍历方式有三种,前序遍历,中序遍历,后序遍历,先序遍历的顺序为:NLR先根结点,然后左子树,右子树;中序遍历顺序为;LNR先左子树,然后根结点,右子树;后序遍历顺序为:LRN先左子树,然后右子树,根结点。
由前序和中序遍历,有中序和后序遍历序列可以唯一确定一棵二叉树对于给几个数据的排序或在已知的几个数据中进行查找,二叉树均能提供一种十分有效的方法,比如在查找问题上,任何借助于比较法查找长度为Ⅳ的一个序表的算法,都可以表示成一株二叉树。
反之,任何二叉树都对应一个查找有序表的有效方法根据树的数学理论,对于算法分析的某些最有启发性的应用,是与给出用于计算各种类型中不同树的数目的公式有关的。
本文对二叉树以及二叉树的各种功能做介绍以及写出一些基本的程序,让读者对二叉树的理解有更好的效果。
关键词:二叉树,左子树,右子树,二叉树的遍历,二叉树的深度等目录摘要 (I)1 课程设计题目及题目基本理论 (1)2 概要设计 (1)3 详细设计 (2)3.1 建立二叉树 (2)3.2二叉树的层次遍历和中序遍历 (2)3.3 求二叉树的深度 (3)3.4将二叉树中所有结点的左右子树相互交换 (4)3.5求二叉树中叶子结点的数目 (5)4 调试分析 (7)5 用户使用说明 (8)6 结论 (9)7 参考文献 (10)二叉树的遍历及其应用基本理论(1)建立二叉树的操作就是用递归算法以先序遍历的次序从根结点开始建立一棵二叉树,(2)利用栈的非递归算法对二叉树进行遍历,从二叉树的根结点开始,自顶向下,同层自左往右访问树中的每个结点,此时,保存结点的顺序和访问的顺序刚好一致(3)用递归算法求出左右子树的深度1 需求分析(1)输入二叉树的特殊先序序列,建立二叉树;(2)实现二叉树的层次遍历和中序遍历;(3)求二叉树的深度;(4)将二叉树中所有结点的左右子树相互交换;(5)求二叉树中叶子结点的数目2 概要设计CreatBinTree(&T):建立一棵二叉树,Value(T,e):查找值为e的二叉树结点,并返回该结点的地址。
数据结构课程设计-二叉树
《数据结构》课程设计说明书二叉平衡树算法实现班级组别:二指导老师:完成时间:2019.6.19 组长:学号:05 组员1:学号:33 组员2:学号:组员3:学号:成绩:目录目录一、课题设计任务 (2)二、任务分析 (2)1. 数据逻辑结构(算法描述) (2)2. 关键算法思想 (3)三、概要设计(总体设计) (3)四、详细设计 (4)1. 数据存储结构 (4)2. 各模块流程图及算法 (5)3. 算法效率分析 (9)五、测试 (10)1. 删除 (10)2. 查找 (10)3. 遍历 (10)六、课程设计心得 (10)七、参考文献 (11)八、附录 (11)一、课题设计任务针对给定的序列建立存储结构,实现各种遍历;实现树的生成,实现数据的查找、插入、删除,输出各种遍历。
二、任务分析1.数据逻辑结构(算法描述)//中序--递归void InorderTra(PNode root) {if (root) {InorderTra(root->leftChild); //中序遍历左子树printf("%d\t", root->keyValue); //访问根节点InorderTra(root->rightChild); //中序遍历右子数}}//前序--递归void PreOrderTra(PNode root) {if (root != NULL) {printf("%d\t", root->keyValue); //访问根节点PreOrderTra(root->leftChild); //前序遍历左子树PreOrderTra(root->rightChild); //前序遍历右子数}}//后序--递归void PostOrderTra(PNode root) {if (root) {PostOrderTra(root->leftChild); //后序遍历左子树PostOrderTra(root->rightChild); //后序遍历右子树printf("%d\t", root->keyValue); //访问根节点}}//求树的最大深度int getDeep(PNode root) {if (!root) {return 0;}int leftDeep = getDeep(root->leftChild) + 1;int rightDeep = getDeep(root->rightChild) + 1;return leftDeep > rightDeep ? leftDeep : rightDeep;}//从根节点开始打印出所有层void printByLevel(PNode root, int deep) {for (int i = 0; i < deep; i++) {LevelOrderTra(root, i);}printf("\n");}2.关键算法思想树的生成过程保持左右平衡,插入删除过程中保证树的平衡。
二叉树与算术表达式
目录一、系统开发的背景 (1)二、系统分析与设计 (1)(一)系统功能要求 (1)(二)系统模块结构设计 (1)三、系统的设计与实现 (1)(一)输入和存储表达式:I NPUT_E XPR()、R EAD E XPR() (1)(二)输出中缀表达式W RITE E XPER() (3)四、系统测试 (4)(一)测试I NPUT_E XPR()、R EAD E XPR() (4)(二)测试W RITE E XPER() (4)五、总结 (4)六、附件(代码、部分图表) (5)二叉树与算术表达式一、系统开发的背景为了方便求出一个表达式的值,因此设计这个算法完成这个功能。
二、 系统分析与设计(一)系统功能要求1、 ReadExpre(E)—以字符序列的形式输入语法正确的前缀表达式并构造表达式E 。
2、 WriteExpre(E)—用带括弧的中缀表达式输出表达式E 。
(二)系统模块结构设计通过对系统功能的分析,算术表达式系统功能如图1所示。
图1 二叉树与算术表达式功能图通过上图的功能分析,把整个系统划分为2个模块: 1、 输入和存储表达式,通过Input_Expr ()函数来实现; 2、 输出中缀表达式,通过WriteExpr ()函数来实现;三、 系统的设计与实现(一)输入和存储表达式:Input_Expr ()、ReadExpr( )分析:用Input Expr ()进行数据的录入,再通过ReadExpr()将之前录入的数据存储进二叉树。
该模块具体代码如下:Status Input_Expr(char *string,int flag){if(flag==0)printf("\n请输入正确的前缀表示式:");else printf("\n请以表达式的原书写形式输入正确表示式:");flushall();gets(string);if(strlen(string)==1)if(string[0]=='+'||string[0]=='-'||string[0]=='*'||string[0]=='/'||string[0]=='^'){ printf("\n表达式只有一个字符,为运算符,错误!");return 0;}elseif((string[0]>='0'&&string[0]<'9')||(string[0]>='a'&&string[0]<='z')||(string[0]>='A'&&string[0]<='Z ')){ printf("\n表达式只有一个字符!");return 1;}else {printf("\n输入的字符不是运算符也不是变量常量,错误!");return 0;} return 1;}Status ReadExpr(BiTree *E,char *exprstring){SqStack S;int i,len;BiTree p,q;(*E)=(BiTree)malloc(sizeof(BiTNode));(*E)->lchild=NULL;(*E)->rchild=NULL;len=strlen(exprstring);if(len==1)ErChaShu(E,exprstring,0);else{ErChaShu(E,exprstring,0);InitStack(&S);q=(*E);Push(&S,q);Push(&S,q);for(i=1;i<len&&!StackEmpty(S);i++){p=(BiTree)malloc(sizeof(BiTNode));ErChaShu(&p,exprstring,i);p->lchild=NULL;p->rchild=NULL;if(exprstring[i]=='+'||exprstring[i]=='-'||exprstring[i]=='*'||exprstring[i]=='/'||exprstring[i] =='^'){if(!q->lchild) {q->lchild=p;Push(&S,p);q=p;}else {q->rchild=p;Push(&S,p);q=p;}}else{if(!q->lchild) {q->lchild=p;Pop(&S,&q);}else {q->rchild=p;Pop(&S,&q);}}}if(StackEmpty(S)&&i>=len)return 1;else{printf("\n输入的表达式有误!");return 0;}}}注:该流程图见附件。
任务书算术表达式与二叉树
附件4:北京理工大学珠海学院课程设计任务书20 ~20 学年第学期学生姓名:专业班级:指导教师:工作部门:一、课程设计题目算术表达式与二叉树二、课程设计内容(含技术指标)【问题描述】一个表达式和一棵二叉树之间,存在着自然的对应关系。
写一个程序,实现基于二叉树表示的算术表达式的操作。
【任务要求】假设算术表达式Expression内可以含有变量(a~z)、常量(0~9)和二元运算符(+,-,*,/,^(乘幂))。
实现以下操作:ReadExpre(E)—以字符序列的形式输入语法正确的前缀表达式并构造表达式E。
WriteExpre(E)—用带括弧的中缀表达式输出表达式E。
Assign(V,c)—实现对变量V的赋值(V=c),变量的初值为0。
Value(E)—对算术表达式E求值。
CompoundExpr(P,E1,E2)--构造一个新的复合表达式(E1)P (E2)【测试数据】分别输入0;a;-91;+a*bc;+*5^x2*8x;+++*3^x3*2^x2x6并输出。
每当输入一个表达式后,对其中的变量赋值,然后对表达式求值。
三、进度安排1.初步设计:写出初步设计思路,进行修改完善,并进行初步设计。
2.详细设计:根据确定的设计思想,进一步完善初步设计内容,按要求编写出数据结构类型定义、各算法程序、主函数。
编译分析调试错误。
3.测试分析:设计几组数据进行测试分析,查找存在的设计缺陷,完善程序。
4.报告撰写:根据上面设计过程和结果,按照要求写出设计报告。
5.答辩考核验收:教师按组(人)检查验收,并提出相关问题,以便检验设计完成情况。
四、基本要求1.在设计时,要严格按照题意要求独立进行设计,不能随意更改。
若确因条件所限,必须要改变课题要求时,应在征得指导教师同意的前提下进行。
2.在设计完成后,应当场运行和答辩,由指导教师验收,只有在验收合格后才能算设计部分的结束。
3.设计结束后要写出课程设计报告,以作为整个课程设计评分的书面依据和存档材料。
算术表达式与二叉树
目录一、系统开发的背景 (1)二、系统分析与设计 (1)(一)系统功能要求 (1)(二)系统模块结构设计 (1)三、系统的设计与实现 (3)(一)二叉树的遍历 (3)(二)算术表达式求值 (5)四、系统测试 (9)(一)测试二叉树遍历函数 (9)(二)测试算术表达式求值函数 (10)五、总结 (10)六、附件(代码、部分图表) (10)(一)程序代码 (10)(二)实验截图 (15)算术表达式与二叉树一、系统开发的背景为了方便进行基本的算术运算,减轻对数字较大的数操作时所带来的麻烦,及其在运算过程中错误的避免。
因此设计算术表达式与二叉树的程序来解决此问题。
二、系统分析与设计(一)系统功能要求由于一个表达式和一棵二叉树之间,存在着自然的对应关系。
遍写一个程序,实现基于二叉树表示的算术表达式的操作。
算术表达式内可以含有变量(a~z)、常量(0~9)和二元运算符(+,-,*,/,^(乘幂))。
具体实现以下操作:1以字符序列的形式输入语法正确的前缀表达式并构造表达式。
2用带括弧的中缀表达式输出表达式。
3实现对变量V的赋值(V=c),变量的初值为0。
4对算术表达式E求值。
(二)系统模块结构设计通过对系统功能的分析,基于二叉树表示的算术表达式的功能如图(1)所示。
图1:基于二叉树表示的算术表达式的功能图通过上图的功能分析,把整个系统划分为主要的两大个模块:1、将语法正确的前缀表达式用二叉树的遍历转换成相应的遍历序列,必要时可以求出此二叉树的结点数及其树的深度。
该模块借助函数BiTree Create(BiTree T)创建二叉树,void Preorder(BiTree T) 先序遍历, void InOrder(BiTree T)中序遍历,void PostOrder(BiTree T)后序遍历,int Sumleaf(BiTree T)统计叶结点的数目,int Depth(BiTree T)二叉树的深度6个函数联合来实现;2、计算中序遍历所得的算术表达式的值。
题目设计一个程序实现基于二叉树表示的算术表达式的操作。
题目:设计一个程序实现基于二叉树表示的算术表达式的操作。
一、需求分析1、以二叉树为基本模型,构建了表达式二叉树。
算术表达式的合法输入数据包括变量(,a~z)、常量(0-9)和二元运算符(+,-,*,/,^(乘幂)),一元运算符(sin,cos,tan)。
演示程序以人机对话的方式执行,即在计算机上显示提示信息后,由用户在键盘上输入对应的数据或命令,程序将执行相应的操作并显示下一步信息。
表达式的输出主要是用带括号的中缀表示式输出调用函数InorderExp( ExpTree E, Status ( * Visit )( ExpTree e ) );2、程序的目的实现算术表达式在计算机里的树形存储,实现基本的运算(+,-,*,/,^(乘幂))sin,cos,tan),求偏导,常数合并。
3、测试数据(附后)。
提供两种方式的测试:一种是自动测试,即程序调用test文件夹data.txt文件里的测试数据,另一种方式是手动测试,即按程序提示一步一步输入测试。
除了满足要求的0; a; -91; +a*bc; +*5^x2*8x; +++*3^x3*2^x2x6,还有几十组数据测试。
每当输入一个表达式后,程序提示用户赋值,再对表达式求值。
为了方便用户,我在程序中用数组保存着一些测试数据,以供测试用。
二、概要设计1.以字符串保存输入的字符序列。
2.提示用户赋值的同时将数据取出建立二叉树。
3.用后根遍历的次序用递归函数对表达式求值,求值时进行相应的转化,将运算数的字符形式转换成整数形式。
4.用中缀表达式输出表达式时,适当添加括号,以正确反映运算的优先次序。
5.抽象数据类型的定义:1)、存放表达式的结构类型,是以二叉树为基本原型。
typedef enum{ OPER, V AR, ORD }ElemTag;//运算符,变量,常量typedef struct ExpNode{ElemTag tag; //标记union{char expr[4]; //存放运算符名struct{char var; //存放变量名int val; //存放变量的值,初始值为0}vary; //存放变量int ordina; //存放常量值};struct ExpNode *lchild, *rchild; /* 左右孩子指针*/} *ExpTree; /* 二叉树的二叉链表存储表示*/基本操作:int Random( int nMin, int nMax );//返回nMin到nMax之间的随机数void FindVary( char * c, char * e );//找出表达式中的变量Status ArrayCreateExp( ExpTree &E, char *ch, int &i );//从ch数组中读取字符串,构造表达式void CreateExp( ExpTree &E, char *ch, int &i ) ;//Status InputCreateExp( ExpTree &E );//从键盘先序输入来构造表达式树TStatus Visit( ExpTree e );//输出e的内容void InorderExp( ExpTree E, Status ( * Visit )( ExpTree e ) );//输出中序表达式用带括号的中缀表示式输出Status Assign( ExpTree E, char v, float c ) ;//对表达式内的所有v,赋值cfloat Value( ExpTree E );//计算表达式的值ExpTree Compound( char p, ExpTree e1, ExpTree e2 );//5.构造一个新的复合表达式(E1)P(E2)Status Diff( ExpTree &E, char V );//求表达式E对变量V的导数void MergeConst( ExpTree E );//合并表达式种所有常数运算Status PreOrderTraverse( ExpTree E, Status ( * Visit )( ExpTree e ) ); //波兰式输出Status PostOrderTraverse( ExpTree E, Status ( * Visit )( ExpTree e ) ); //逆波兰式输出2)、队列typedef char QElemType;typedef struct QNode{QElemType data;struct QNode *next;}QNode, *QuePtr;typedef struct{QuePtr front;QuePtr rear;}Queue;基本操作:Status InitQueue( Queue &Q );//构造一个空队列Status DestroyQueue( Queue &Q );//销毁队列Status QueueEmpty( Queue Q );//判空Status EnQueue( Queue &Q, QElemType e );//插入元素e为Q的新的队尾元素Status DeQueue( Queue &Q, QElemType &e );//删除队头元素,用e返回其值,并返回OK,否则返回ERROR;3)、栈typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;基本操作:Status InitStack( SqStack &S );Status StackEmpty( SqStack S );Status Push( SqStack &S, SElemType e );Status Pop( SqStack &S, SElemType &e );SElemType Top( SqStack S );6、主程序:void main(){while(1){ 接受命令处理命令;Switch(){case: 1.以数组形式输入前缀表示式函数构造表达式.case: 2.以字符序列输入前缀表示式函数构造表达式.case: 3.实现对变量V的赋值(V=c).case: 4.对算术表达式E求值.\n");case: 5.构造一个新的复合表示式(E1)P(E2).case: 6.求偏导函数Diff(E,V)case: 7.对三角函数的测试.case: 8.常数合并.case: 0.结束}}三、详细设计1、存放表达式的结构类型,是以二叉树为基本原型。
二叉树课程设计
实验6・1实现二叉树各种基本运算的算法编写一个程序algo6-l.cpp,实现二叉树的各种运算,并在此基础上设计一个主程序完成如卞功能(T为如图所示的一棵二叉树):(1)以括号表示法输出二叉树To(2)输出H结点的左、右孩子结点值。
(3)输出二叉树T的叶子结点个数。
(4)输出二叉树T的深度。
(5)输出对二叉树T的先序遍历序列。
(6)输出对二叉树T的中序遍历序列。
(7)输出对二叉树T的后序遍历序列。
提示:创建二叉树的算法参见书上131页的算法6.4。
按先序序列输入二叉树中结点的值(一个字符),#字符表示空树。
输入序列:以括号表示法输出二叉树的结果为:A(E(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))程序段#iiiclude<stdio.h>#mclude<stdlib.h>#mclude<sy&/tmieb.h>//#defiiie MAX 50^define OK 1tvpedef stmct btnode{chai Data;//VSapaEv%YAUEYstnict btiiode *Lliiik;//x 6 x OE^O ,Oe stnict btiiode *Rliiik;Z OO xOE^O ,Oe } btnode. *btreetype;//n di6d^p2jeE-mt IiiitBiTiee(btreetype &T){T=NULL;return OK;}〃%・・A绷咗茁void CreatBiTree(btieetype &T) {char ch;scanf(”%c”,&ch);if(ch— ?T=NULL;else{T=(btreetype)malloc(sizeof(btnode));if(!T)exit(-l);T->Data=ch;CreatBiTree(T->Llu±);CreatBiTiee(T->Rlu±);}}//Ea3d56apanAx6o0xOvoid LeftCluld(btreetype &M,chai e) btreetvpe p;p=M;if(p!=NULL){if(p->Data==e){printf(n%c|iAx6o0x6E(^%c\n,\e,p->Llink->Data);} LeftCliild(p->Lliiik.e);LeftCluld(p->Rliiik.e);}}//Ea3dVSapapAOd o0x6void RightCluld(btieetvpe &Machar 亡)btreetvpe p;p=M;if(p!=NULL){if(p->Data==e){prmtf(n%cpA6d o0x6E(^%c\ii,\e,p->Rluik->Data);} RightChild(p->Llink,e);RightChild(p->Rluik,e);}}//P%^6<jx6!4apa,dEymt LeafPoint(btreetype t) return 0;elseif(! t->Lluik&&! t->Rliiik)return 1;elsereturn (LeafPoint(t->Lliiik) + LeafPoint(t->Rlink));}mt Depth(btieetype T)int ij; if(!T)iettun 0; if(T->Llink) i=Depth(T->Llink);else i=0;if<T->Rluik)j=Depth(T->Rliiik);elsej=O;return i>j?i+l:j+l;//A,,o A±iE^- •宅护6他逸応一void DispBiTiee(btreetype T){ if(T!=NULL){pnntfC%c”T>Data);if (T>Llmk!=NULL||T丄・Rhnk!=NULL) {pnntfCC);DispBiTree(T->Llink);if (T->Rlink!=NULL)pniitf(T);DispBiTree(T->Rluik);}}}//IEDdieAu^^E-void PreOider(btieetype T){】f(T){ pnntfC%c”T>Data); PreOrder(T->Llink); PreOrder(T->Rlink);}}//ODDd±eAu>2KE-void InOrder(btreetype T){】f(T){IiiOider(T->LlH±); pnntfC%c”T>Data);IiiOider(T->Rlnik);}}//°6Dd±eAu>z ieE-void PostOrder(btreetype T){】f(T){PostOrder(T->LlHik); PostOider(T->Rliiik); pnntfC%c”T>Data);void main(){timeb tl,t2;ftune(&tl);long m.n;卩门11耳2合6龙1^4£05\2它6口日企即(人6車卩461&良・・・£一注・・・6方6左1)2応±6注&存伙0・丫4£7 亘AiT6ldi(E\jr);btreetype T;InitBiTree(T);CieatBiTiee(T);pnntf(M A,,o A±iE%--Ea3d>2zeE-:\ii M);DispBiTree(T);prmtf(n\n H);LeftChild(I;H);RightCluld(T:H,);m=LeafPoint(T);pimtf(n6D%d,d6|x6!6apa\ir\m);n=Depth(T);printf(,,^2a5E-^-|LiAEi1]EE(7%d\n l,,n);prmtf(H iEDd=eAu<jl)2ieE-:H);PreOrder(T);pimtf(n\n H);pimtf(n ODDd±eAu>2JEE-:M);InOrder(T);pimtf(,,o6Dd^eAu>2«E-:n);PostOrder(T);prmtf(n\n H);ftime(&t2);t=(t2.time-tl .time)* 10004-(t2.nullitm-tl .nullitm); pnntf(,,d,DD±%3iDd126AE±%ld o AAe\ir\t);}。
15算术表达式与二叉树
《数据结构与算法》课程设计任务书题目:算术表达式与二叉树学生姓名:学号:班级:题目类型:软件工程(R)指导教师:一.题目简介一个表达式和一棵二叉树之间,存在着自然的对应关系。
本设计要求学生编程实现基于二叉树表示的算术表达式的操作。
通过该题目的设计过程,可以加深理解树及二叉树的逻辑结构、存储结构以及递归算法设计的基本原理,掌握树及二叉树上基本运算的实现。
进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养学生的动手能力。
二.主要任务第一部分:基本算法实现1、线性结构基本算法实现(指导老师根据题目指定);2、树型结构基本算法实现(指导老师根据题目指定);3、图型结构基本算法实现(指导老师根据题目指定);4、查找基本算法实现(指导老师根据题目指定);5、排序基本算法实现(指导老师根据题目指定);第二部分:指定题目的设计与实现1、查阅文献资料,一般在3篇以上;2、建立数据的逻辑结构和物理结构;3、完成相应算法的设计;4、完成测试工作;5、撰写设计说明书;6、做好答辩工作。
三.主要内容、功能及技术指标假设算术表达式Expression内可以含有变量(a~z)、常量(0~9)和二元运算符(+,-,*,/,^(乘幂))。
实现以下操作:(1)ReadExpre(E)—以字符序列的形式输入语法正确的前缀表达式并构造表达式E。
(2)WriteExpre(E)—用带括弧的中缀表达式输出表达式E。
(3)Assign(V,c)—实现对变量V的赋值(V=c),变量的初值为0。
(4)Value(E)—对算术表达式E求值。
(5)CompoundExpr(P,E1,E2)--构造一个新的复合表达式(E1)P(E2)(6)算法对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果;对算法实现过程中的异常情况能给出有效信息;(7)较高要求:实现图形化操作界面。
四.提交的成果1. 设计说明书一份,内容包括:1) 中文摘要100字;关键词3-5个;2) 序言;3)采用类c语言定义相关的数据类型4)各模块的伪码算法5)函数的调用关系图6)调试分析a、调试中遇到的问题及对问题的解决方法;b、算法的时间复杂度和空间复杂度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
山西大学课程设计任务书设计题目算术表达式与二叉树所属课程:数据结构系别软件学院专业软件工程班级软工1408班姓名霍志斌指导教师李雪梅设计任务下达日期 2015年 12 月15 日设计时间2016年1月4日至 2016年1月8日目录:一、需求分析二、概要设计1、数据类型的声明:2、表达式的抽象数据类型定义3、整体设计三、详细设计1、二叉树的存储类型2、顺序栈的存储类型3、表达式的基本操作4、主程序和其他伪码算法5、函数的调用关系四、设计和调试分析五、测试六、课程设计的心得和心得以及问题一、需求分析【课程设计要求】【问题的描述】一个表达式和一棵二叉树之间,存在着自然的对应关系。
写一个程序,实现基于二叉树表示的算术表达式Expression的操作。
【基本要求】假设算术表达式Expression内可以含有变量(a-z),常量(0-9)和二元运算符(+,-,*,/,^(乘幂))。
实现以下操作:(1)ReadExpr(E)――以字符序列的形式输入语法正确的前缀表达式并构造表达式E。
(2)WriteExpr(E)――用带括号的中缀表达式输出表达式E。
(3)Assign(V,c)――实现对变量V的赋值(V=c),变量的初值为0。
(4)Value(E)――对算术表达式E求值。
(5)CompoundExpr(p,E1,E2)――构造一个新的复合表达式(E1)p(E2)。
【测试数据】1)分别输入0;a;-91;+a*bc;+*5x2*8x;+++*3^*2^x2x6并输出。
2)每当输入一个表达式后,对其中的变量赋值,然后对表达式求值。
二、概要设计1、数据类型的声明:在这个课程设计中,采用了链表二叉树的存储结构,以及两个顺序栈的辅助存储结构/*头文件以及存储结构*/#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<string.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW 0typedef int Status;2、表达式的抽象数据类型定义ADT Expression{数据对象D:D是具有数值的常量C和没有数值的变量V;数据关系:R={<(V或者C)P(V或者C)>|V,C∈D, <(V或者C)P(V或者C)>表示由运算符P结合起来的表达式E}基本操作:Status Input_Expr(&string,flag)操作结果:以字符序列的形式输入语法正确的前缀表达式,保存到字符串string;参数flag表示输出的提示信息是什么,输入成功返回OK,否则,返回ERROR。
void judge_value(&E,&string,i)初始条件:树E存在,表达式的前缀字符串string存在;操作结果:判断字符string[i],如果是'0'-'9'常量之间,二叉树结点E存为整型;否则,存为字符型。
Status ReadExpr(&E,&exprstring)初始条件:表达式的前缀形式字符串exprstring存在;操作结果:以正确的前缀表示式exprstring并构造表达式E,构造成功,返回OK,否则返回ERROR。
Status Pri_Compare(c1,c2)初始条件:c1和c2是字符;操作结果:如果两个字符是运算符,比较两个运算符的优先级,c1比c2优先,返回OK,否则返回ERROR。
void WriteExpr(&E)初始条件:表达式E存在;操作条件:用带括弧的中缀表达式输入表达式E。
void Assign(&E,V,c,&flag)初始条件:表达式E存在,flag为标志是否有赋值过;操作结果:实现对表达式E中的所有变量V的赋值(V=c)。
long Operate(opr1,opr,opr2)初始条件:操作数opr1和操作数opr2以及操作运算符opr;操作结果:运算符运算求值,参数opr1,opr2为常量,opr为运算符,根据不同的运算符,实现不同的运算,返回运算结果。
Status Check(E)初始条件:表达式E存在;操作结果:检查表达式E是否还存在没有赋值的变量,以便求算数表达式E的值。
long Value(E)初始条件:表达式E存在;操作结果:对算术表达式求值,返回求到的结果。
void CompoundExpr(P,&E1,E2)初始条件:表达式E1和E2存在;操作条件:构造一个新的复合表达式(E1)P(E2)。
Status Read_Inorder_Expr(&string,&pre_expr)操作结果:以表达式的原书写形式输入,表达式的原书写形式字符串string变为字符串pre_expr,后调用reversal_string()函数反转得到前缀表达式pre_expr。
得到正确的前缀表达式返回OK,否则,返回ERROR。
void MergeConst(&E)操作结果:常数合并操作,合并表达式E中所有常数运算。
}ADT Expression3、整体设计在这个课程设计中,有两个源代码文件:expression.h和expression.c。
在expression.h文件中,包含了各个存储结构的声明和辅助存储结构的两个栈的基本操作;在expression.c文件中,是实现课程设计要求的各个函数。
《一》expression.h文件的整体结构1、各个存储结构的声明;2、两个除了栈名和栈存储的元素不一样的顺序栈的基本操作。
其基本操作如下:对于栈SqStack:Status InitStack(SqStack *S) /* 构造一个空栈S */Status StackEmpty(SqStack S) /* 若栈S为空栈,则返回TRUE,否则返回FALSE */ Status Push(SqStack *S,SElemType e) /* 插入元素e为新的栈顶元素 */Status Pop(SqStack *S,SElemType *e) /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */Status GetTop(SqStack S,SElemType *e) /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */对于栈SqStack1:Status InitStack1(SqStack1 *S) /* 构造一个空栈S */Status StackEmpty1(SqStack1 S) /* 若栈S为空栈,则返回TRUE,否则返回FALSE */ Status Push1(SqStack1 *S,SElemType1 e) /* 插入元素e为新的栈顶元素 */Status Pop1(SqStack1 *S,SElemType1 *e) /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */Status GetTop1(SqStack1 S,SElemType1 *e) /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */顺序栈的基本操作的算法见程序清单。
《二》expression.c文件的整体结构1、主程序模块的整体流程可以从主菜单函数可以明了的了解的程序的整体流程,主菜单函数menu()如下:char menu(){char choice;printf("\n****************************************");printf("\n 1 >>>输入正确的前缀表达式");printf("\n 2 >>>带括弧的中缀表示式输出");printf("\n 3 >>>对变量进行赋值");printf("\n 4 >>>对算数表达式求值");printf("\n 5 >>>构造一个新的复合表达式");printf("\n 6 >>>以表达式的原书写形式输入");printf("\n 7 >>>合并表达式中所有常数运算");printf("\n 0 >>>退出");printf("\n****************************************");printf("\n请输入你的选择>>>>>");choice=getche();return choice;}在主函数中,采用多分支程序设计语句switch()使程序产生不同的流向,从而达到实现课程设计的各个要求。
void main(){while(1){清屏;switch(主菜单){根据不同的选择,调用不同的操作函数,完成各个操作;}}}2、本程序有四个模块,主程序模块,二叉树模块,两个顺序栈模块。
四者的调用关系如下:主程序模块中的对于表达式的存储结构调用了二叉树模块,而在构造表达式的二叉树模块中又调用了顺序栈SqStack模块,主程序中在将原表达式形式输入表达式转换为前缀表达式操作中调用了顺序栈SqStack1模块。
三、详细设计1、二叉树的存储类型/*二叉树结点类型*/typedef enum{INT,CHAR}ElemTag;/*INT为整型数据num,CHAR为字符型数据c*/ typedef struct TElemType{ElemTag tag;/*{INT,CHAR}指示是整型还是字符型*/union{int num;/*tag=INT时,为整型*/char c;/*tag=CHAR时,为字符型*/};} TElemType;/*二叉树的二叉链表存储表示 */typedef struct BiTNode{TElemType data;struct BiTNode *lchild,*rchild; /* 左右孩子指针 */}BiTNode,*BiTree;二叉树的基本操作已经在构造表达式和表达式中的基本操作中根据不同的功能和实际情况修改了,详细见各个函数操作的算法设计。
2、顺序栈的存储类型/*栈的顺序存储表示 */#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */#define STACKINCREMENT 2 /* 存储空间分配增量 *//*两个顺序栈*/typedef struct SqStack{SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */SElemType *top; /* 栈顶指针 */int stacksize; /* 当前已分配的存储空间,以元素为单位 */}SqStack; /* 顺序栈SqStack */typedef struct SqStack1{SElemType1 *base; /* 在栈构造之前和销毁之后,base的值为NULL */SElemType1 *top; /* 栈顶指针 */int stacksize; /* 当前已分配的存储空间,以元素为单位 */}SqStack1; /* 顺序栈SqStack1 */相关的基本操作见上面的“expression.h文件的整体结构”的说明,详细的算法设计见附录的程序清单。