算术表达式与二叉树
全国计算机等级考试二级公共基础之树与二叉树1

全国计算机等级考试二级公共基础之树与二叉树1.6 树与二叉树1.6.1 树的基本概念树是一种简单的非线性结构。
在树这种结构中,所有元素之间的关系具有明显的层次关系。
用图形表示树这种数据结构时,就象自然界中的倒长的树,这种结构就用“树”来命名。
如图:在树结构中,每个结点只有一个前件,称为父结点,没有前件的结点只有一个,称为树的根结点,简称为树的根(如R)。
在树结构中,每一个结点可以有多个后件,它们都称为该结点的子结点。
没有后件的结点称为叶子结点(如W,Z,A ,L,B,N,O,T,H,X)。
在树结构中,一个结点拥有的后件个数称为结点的度(如R的度为4,KPQDEC 结点度均为2)。
树的结点是层次结构,一般按如下原则分层:根结点在第1层;同一个层所有结点的所有子结点都在下一层。
树的最大层次称为树的深度。
如上图中的树深度为4。
R结点有4棵子树,KPQDEC结占各有两棵子树;叶子没有子树。
在计算机中,可以用树结构表示算术运算。
在算术运算中,一个运算符可以有若干个运算对象。
如取正(+)与取负(-)运算符只有一个运算对象,称为单目运算符;加(+)、减(-)、乘(*)、除(/)、乘幂(**)有两个运算对象,称为双目运算符;三元函数f(x,y,z)为 f函数运算符,有三个运算对象,称为三目运算符。
多元函数有多个运算对象称多目运算符。
用树表示算术表达式原则是:(1)表达式中的每一个运算符在树中对应一个结点,称为运算符结点(2)运算符的每一个运算对象在树中为该运算结点的子树(在树中的顺序从左到右)(3)运算对象中的单变量均为叶子结点根据上面原则,可将表达式:a*(b+c/d)+c*h-g*f表示如下的树。
树在计算机中通常用多重链表表示,多重链表的每个结点描述了树中对应结点的信息,每个结点中的链域(指针域)个数随树中该结点的度而定。
1.6.2 二叉树及其基本性质1. 什么是二叉树二叉树是很有用的非线性结构。
它与树结构很相似,树结构的所有术语都可用到二叉树这种结构上。
简易计算器(二叉树)

实验三——简易计算器(二叉树)05111341班李凌豪 11201312631.需求分析1.1.问题重述(1)问题描述由键盘输入一算术表达式,以中缀形式输入,试编写程序将中缀表达式转换成一棵二叉表达式树,通过对该的后序遍历求出计算表达式的值。
(2)基本要求a.要求对输入的表达式能判断出是否合法。
不合法要有错误提示信息。
b.将中缀表达式转换成二叉表达式树。
c.后序遍历求出表达式的值(3)数据结构与算法分析一棵表达式树,它的树叶是操作数,如常量或变量名字,而其他的结点为操作符。
a.建立表达式树。
二叉树的存储可以用顺序存储也可用链式存储。
当要创建二叉树时,先从表达式尾部向前搜索,找到第一个优先级最低的运算符,建立以这个运算符为数据元素的根结点。
注意到表达式中此运算符的左边部分对应的二叉绔为根结点的左子树,右边部分对应的是二叉绔为根结点的右子树,根据地这一点,可用递归调用自己来完成对左右子树的构造。
b.求表达式的值。
求值时同样可以采用递归的思想,对表达式进行后序遍历。
先递归调用自己计算左子树所代表的表达式的值,再递归调用自己计算右子树代表的表达式的值,最后读取根结点中的运算符,以刚才得到的左右子树的结果作为操作数加以计算,得到最终结果。
(4)测试1.2.问题分析本实验要求我们编写一个程序,利用二叉树,实现简易计算器的功能。
实现实数范围内的四则混合运算,而且要考虑括号对运算顺序的影响。
而且,题目要求用二叉树的知识来实现程序功能,因此需要将输入的中序表达式转换成逆波兰序列,然后就以此序列建立二叉链表,之后通过后序遍历实现运算的功能。
大概要求就是这样的。
2.概要设计2.1.抽象数据类型的定义考虑到,算符为字符型变量,算数为单精度浮点型变量。
考虑先讲输入的浮点数替换为char型的符号。
Struct jd为二叉链表的节点类型。
每一个节点都有字符域data,数字的话会有数值域shuzi为单精度浮点数。
struct jd{char data;float shuzi;struct jd *next1;struct jd *next2;};Struct haha 类型的数组ka[20]用来存放运算数,如果是运算数,就存进来,然后用字符域fuhao来代替数值域的单精度shuzi。
基于二叉树的算术表达式计算与实现

&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 ) ) ) {
二叉树计算表达式

二叉树计算表达式计算表达式是计算机科学中常见的任务,而二叉树是一种常用的数据结构,用于表示表达式。
本文将介绍二叉树如何表示和计算表达式。
一、二叉树表示表达式二叉树是由节点和边组成的树状结构。
每个节点都包含一个值和两个指向左右子节点的指针。
二叉树可以用来表示数学表达式。
例如,下面是一个包含加、减、乘、除的表达式:```5 + 3 *6 / 2 - 4```将表达式转化为二叉树表示,根节点为`-`,其左子树是`+`,右子树是`4`。
`+`节点的左子树为`5`,右子树为`/`。
`/`节点的左子树为`*`,右子树为`2`。
`*`节点的左子树为`3`,右子树为`6`。
```-/ \+ 4/ \5 // \* 2/ \3 6```每个节点的值表示该节点的操作符或操作数。
叶子节点是操作数,内部节点是操作符。
二、计算二叉树表达式计算表达式需要递归地对二叉树进行遍历。
从根节点开始,如果是操作符节点,就对其左右子节点进行递归。
如果是操作数节点,就返回该节点的值。
等到递归完成后,就可以根据操作符节点的值和左右子节点的值对表达式进行计算了。
对于上面的表达式二叉树,计算的过程如下。
首先计算根节点的左右子节点,即`+`节点和`4`节点的值。
`+`节点还需要计算其左右子节点`5`和`/`节点的值。
`/`节点又需要计算其左右子节点`*`和`2`的值。
`*`节点需要计算其左右子节点`3`和`6`的值。
归纳起来,计算的顺序是从下到上,从左到右。
```-/ \+ 4/ \5 // \* 2/ \3 6```按照计算顺序求值:1. 计算`3 * 6`,得到18。
2. 计算`6 / 2`,得到3。
3. 计算`3 / 3`,得到1。
4. 计算`5 + 1`,得到6。
5. 计算`6 - 4`,得到2。
因此,表达式`5 + 3 * 6 / 2 - 4`的值是2。
三、扩展上面的例子说明了如何将表达式转为二叉树,并计算表达式的值。
但实际中会有更复杂的表达式,如函数调用、变量引用等。
数据结构习题第六章树和二叉树

第六章 树和二叉树一、选择题1.已知一算术表达式的中缀形式为 A+B*C-D/E ,后缀形式为ABC*+DE/-,其前缀形式为( )A .-A+B*C/DE B. -A+B*CD/E C .-+*ABC/DE D.-+A*BC/DE【北京航空航天大学 1999 一、3 (2分)】2.算术表达式a+b*(c+d/e )转为后缀表达式后为( )【中山大学 1999 一、5】A .ab+cde/*B .abcde/+*+C .abcde/*++D 3. 设有一表示算术表达式的二叉树(见下图),它所表示的算术表达式是( ) 【南京理工大学1999 一、20(2分)】 A. A*B+C/(D*E)+(F-G) B. (A*B+C)/(D*E)+(F-G) C. (A*B+C)/(D*E+(F-G )) D. A*B+C/D*E+F-G 4. 设树T 的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1 则T 中的叶子数为( )A .5B .6C .7D .8【南京理工大学 2000 一、8 (1.5分)】5. 在下述结论中,正确的是( )【南京理工大学 1999 一、4 (1分)】①只有一个结点的二叉树的度为0; ②二叉树的度为2; ③二叉树的左右子树可任意交换;④深度为K 的完全二叉树的结点个数小于或等于深度相同的满二叉树。
A .①②③B .②③④C .②④D .①④6. 设森林F 对应的二叉树为B ,它有m 个结点,B 的根为p,p 的右子树结点个数为n,森林F 中第一棵树的结点个数是( )A .m-nB .m-n-1C .n+1D .条件不足,无法确定 【南京理工大学2000一、17(1.5分)】7. 树是结点的有限集合,它( (1))根结点,记为T 。
其余结点分成为m (m>0)个((2))的集合T1,T2, …,Tm ,每个集合又都是树,此时结点T 称为Ti 的父结点,Ti 称为T的子结点(1≤i ≤m )。
算术表达式(例题)-二叉树

最早提出遍历问题的是对存储在计算机中的表达式求值。
例如:(a+b ×(c-d))-e/f 。
表达式用树形来表示,如图8-11-1所示。
运算符在树中放在非终端结点的位置上,操作数放在叶子结点处。
当我们对此二叉树进行先序、中序和后序遍历后,便可得到表达式的前缀、中缀和后缀书写形式:前缀:-+a*b-cd/ef中缀:a+b*c-d-e/f 后缀:abcd-*+ef/-其中,中缀形式是算术表达式的通常形式,只是没有括号。
在计算机内,使用后缀表达式易于求值。
例1 输入一个算术表达式,判断该表达式是否合法,若不合法,给出错误信息;若合法,则输出合法表达式的表达式树。
【算法分析】表达式不合法有三种情况:①左右括号不匹配;②变量名不合法;③运算符两旁无参与运算的变量或数。
分析表达式树可以看到:表达式的根结点及其子树的根结点为运算符,其在树中的顺序是按运算的先后顺序从后到前,表达树的叶子为参与运算的变量或数。
表达式树如图8-11-2处理时,首先找到运算级别最低的运算符“+”作为根结点,继而确定该根结点的左、右子树结点在表达式串中的范围为a 和(b-c)/d ,再在对应的范围内寻找运算级别最低的运算符作为子树的根结点,直到范围内无运算符,则剩余的变量或数为表达式树的叶子。
【算法步骤】① 设数组ex 存放表达式串的各字符,lt 、rt 作为结点的左右指针,变量left 、right 用于存放每次取字符范围的左、右界。
② 设置左界初值为1;右界初值为串长度。
③ 判断左右括号是否匹配,不匹配则认为输入有错误。
④ 在表达式的左右界范围内寻找运算级别最低的运算符,同时判断运算符两旁有否参与运算的变量或数。
若无,则输入表达式不合法;若有,作为当前子树的根结点,设置左子树指针及其左右界值,设置右子树指针及其左右界值。
⑤ 若表达式在左右界范围内无运算符,则为叶子结点,判断变量名或数是否合法。
⑥ 转④,直到表达式字符取完为止。
数据结构实验二叉树

实验六:二叉树及其应用一、实验目的树是数据结构中应用极为广泛的非线性结构,本单元的实验达到熟悉二叉树的存储结构的特性,以及如何应用树结构解决具体问题。
二、问题描述首先,掌握二叉树的各种存储结构和熟悉对二叉树的基本操作。
其次,以二叉树表示算术表达式的基础上,设计一个十进制的四则运算的计算器。
如算术表达式: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 运算,并将其结果再次放入栈中,此时表达式结束,则栈中的元素值就是该表达式最后的运算结果。
第6章测试题

一、选择题1.设树的度为4,其中度为1,2,3,4的结点个数分别为4,2,1,1,则树中的叶子数为( )。
A .5B .6C .7D .82.在下述结论中,正确的是( )。
①只有一个结点的二叉树的度为0②二叉树的度为2③二叉树的左右子树可以任意交换④深度为K 的完全二叉树的结点个数小于或等于深度相同的满二叉树A .①②③B .②③④C .②④D .①④3.设森林F 对应的二叉树为B ,它有m 个结点,B 的根为p ,p 的右子树结点个数为n ,森林F 中第一棵数的结点个数是( )。
A .m-nB .m-n-1C .n+1D .无法确定4.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是( )。
A .9B .11C .15D .不确定5.一棵完全二叉树上有1001个结点,其中叶子结点的个数( )。
A .500B .254C .505D .以上都不对6.设给定权值总数有n 个,其哈夫曼树的结点总数为( )。
A .不确定B .2n+1C .2nD .2n-17.一棵二叉树高度为h ,所有结点的度为0或2,则这棵树最少有( )个结点。
A .2hB .2h-1C .2h+1D .h+18.在一棵高度为k 的满二叉树中,结点总数为( )A .2k-1B .2kC .2k -1D .⎣⎦12log +k 9.树的后根序遍历等同于该树对应的二叉树的( )。
A .先序序列B .中序序列C .后序序列二、填空题1.二叉树由 、 、 三个基本单元组成。
2.树在计算机内的表示方式有 、 、 。
3.在二叉树中,指针p 所指结点为叶子结点的条件是 。
4.二叉树中某一结点左子树的深度减去右子树的深度称为该结点的 。
5.具有256个结点的完全二叉树的深度为 。
6.已知一棵度为3的树有2个度为1的结点,3个度为2的结点,4个度为3的结点,则该树有 个叶子结点。
7.深度为k 的二叉树至少有 个结点,至多有 个结点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录一、系统开发的背景 (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、计算中序遍历所得的算术表达式的值。
其中先要将扫描得到的中缀表达式转换为后缀表达式,然后利用栈的初始化,进栈与取栈顶元素操作进行对后缀表达式进行计算。
该模块借助函数void InitStack(SeqStack *S)初始化栈,int PushStack(SeqStack *S,char e)进栈,int GetTop(SeqStackS,char *e)取栈顶元素,void TranslateExpress(char str[],char exp[])中缀表达式转后缀表达式,float ComputeExpress(char a[])计算后缀表达式的值来实现;三、系统的设计与实现(一)二叉树的遍历分析:首先构建一棵二叉树,然后依次输出每个遍历的序列。
流程图如图2所示。
图2:二叉树的遍历流程图该模块的具体代码如下所示:#include<stdio.h>#include<string.h>#define MaxSize 50typedef struct{ float data[MaxSize];int top;}OpStack;typedef struct{char data[MaxSize];int top;}SeqStack;typedef struct BiTNode{char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;BiTree Create(BiTree T)//用扩展先序遍历序列创建二叉树{ char ch;ch=getchar();if(ch=='0')T=NULL;else {T=new BiTNode;T->data=ch;T->lchild=Create(T->lchild);T->rchild=Create(T->rchild); }return T;}void Visit(char ch)//访问根节点{ printf("%c ",ch);}void Preorder(BiTree T)//先序遍历{ if(T==NULL)return;Visit(T->data);Preorder(T->lchild);Preorder(T->rchild);}void InOrder(BiTree T)//中序遍历{ if(T==NULL)return;InOrder(T->lchild);Visit(T->data);InOrder(T->rchild);}void PostOrder(BiTree T)//后序遍历{if(T==NULL)return;PostOrder(T->lchild);PostOrder(T->rchild);Visit(T->data);}int Sumleaf(BiTree T)//统计叶结点的数目{int sum=0,m,n;if(T){if((!T->lchild)&&(!T->rchild))//该结点的左或右分支为空时 sum++;m=Sumleaf(T->lchild);sum=sum+m;n=Sumleaf(T->rchild);sum=sum+n;}return sum;}int Depth(BiTree T)//二叉树的深度{int dep=0,depl,depr;if(!T) dep=0;else{depl=Depth(T->lchild);depr=Depth(T->rchild);dep=1+(depl>depr?depl:depr);}return dep;}void main(){BiTree T;int sum,k;printf("请输入二叉树中的元素(以扩展先序遍历序列输入):\n");T=Create(T);printf("先序遍历序列为:");Preorder(T);printf("\n");printf("中序遍历序列为:");InOrder(T);printf("\n");printf("后序遍历序列为:");PostOrder(T);printf("\n");sum=Sumleaf(T);printf("叶结点的数目为:%d\n",sum);k=Depth(T);printf("二叉树的深度为:%d\n",k);}(二)算术表达式求值分析:首先初始化一个栈,然后对相关的数据元素及运算符进栈,之后中缀表达式转后缀表达式计算出后缀表达式的值。
流程图如图3所示。
图3:算术表达式求值流程图该模块的具体代码如下所示:#include<stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>#include<math.h>#define NULL 0#define MaxSize 50typedef struct{ float data[MaxSize];int top;}OpStack;typedef struct{char data[MaxSize];int top;}SeqStack;void InitStack(SeqStack *S)//初始化栈{ S->top=0; }int StackEmpty(SeqStack S)//判断栈是否为空{ if(S.top ==0) return 1;else return 0; }int PushStack(SeqStack *S,char e)//进栈{if(S->top>=MaxSize){ printf("栈已满,不能进栈!");return 0;} else{ S->data[S->top]=e;S->top++;return 1; } }int PopStack(SeqStack *S,char *e)//删除栈顶元素{ if(S->top==0){ printf("栈已空\n");return 0;} else {S->top--;*e=S->data[S->top];return 1; } }int GetTop(SeqStack S,char *e)//取栈顶元素{ if(S.top<=0){printf("栈已空"); return 0;}else {*e=S.data[S.top-1];return 1; } }void TranslateExpress(char str[],char exp[])//把中缀表达式转换为后缀表达式{SeqStack S; char ch; char e;int i=0,j=0;InitStack(&S);ch=str[i]; i++;while(ch!='\0') //依次扫描中缀表达式{ switch(ch){ case'(': PushStack(&S,ch); break;case')':while(GetTop(S,&e)&&e!='('){PopStack(&S,&e);exp[j]=e;j++; }PopStack(&S,&e);break;case'+':case'-':while(!StackEmpty(S)&&GetTop(S,&e)&&e!='('){ PopStack(&S,&e);exp[j]=e;j++; }PushStack(&S,ch);break;case'^':case'*':case'/':while(!StackEmpty(S)&&GetTop(S,&e)&&e=='/'||e=='*'||e=='^'){PopStack(&S,&e);exp[j]=e; j++; }PushStack(&S,ch);break; //是空格就忽略case' ': break;default:while(ch>='0'&&ch<='9'){ exp[j]=ch; j++;ch=str[i];i++; }i--; exp[j]=' ';j++; }ch=str[i];i++; }while(!StackEmpty(S)) //将栈中剩余运算符出栈{PopStack(&S,&e);exp[j]=e;j++; } exp[j]='\0'; }float ComputeExpress(char a[])//计算后缀表达式的值{OpStack S;int i=0; float x1,x2,value; float result;S.top=-1;while(a[i]!='\0') //依次扫描后缀表达式{ if(a[i]!=' '&&a[i]>='0'&&a[i]<='9')//如果是数字{ value=0;while(a[i]!=' ') //如果不是空格{ value=10*value+a[i]-'0';i++;} S.top++;S.data[S.top]=value; //处理后进栈} else //如果是运算符{switch(a[i]){case'+':x1=S.data[S.top]; S.top--;x2=S.data[S.top]; S.top--;result=x1+x2; S.top++;S.data[S.top]=result; break;case'-':x1=S.data[S.top]; S.top--;x2=S.data[S.top]; S.top--;result=x2-x1; S.top++;S.data[S.top]=result; break;case'*':x1=S.data[S.top]; S.top--;x2=S.data[S.top]; S.top--;result=x1*x2; S.top++;S.data[S.top]=result; break;case'/':x1=S.data[S.top]; S.top--;x2=S.data[S.top]; S.top--;result=x2/x1; S.top++;S.data[S.top]=result; break;case'^':x1=S.data[S.top]; S.top--;x2=S.data[S.top]; S.top--;result=float(pow(x1,x2)); S.top++;S.data[S.top]=result; break;} i++;}}if( S.top !=-1) //如果栈不空,将结果出栈并返回{ result=S.data[S.top];S.top--; if(S.top==-1)return result;else { printf("表达式错误");exit(-1); }} return 0; }void main(){char a[MaxSize],b[MaxSize];float f;printf("请输入一个算术表达式:");scanf("%s",&a);printf("中缀表达式为:%s\n",a);TranslateExpress(a,b);printf("后缀表达式为:%s\n",b);f=ComputeExpress(b);printf("计算结果:%f\n",f);}四、系统测试(一)测试二叉树遍历函数:测试的结果如图4。