基于二叉树结构的表达式求值算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
课程名称: 程序设计与数据结构 指导老师: ljq 成绩: 实验名称:基于二叉树结构的表达式求值算法 实验类型: 上机 同组学生姓名:
一、实验目的和要求(必填)
三、代码缺陷及修正记录
五、讨论、心得
二、实验内容和代码(必填) 四、实验结果与分析(必填)
一、实验目的和要求
1. 掌握编程工具的使用
2. 掌握二叉树数据结构在计算机上的实现
3. 掌握通过计算机编程解决问题的基本方法
二、实验内容和代码
1.实验内容:
● 编程实现基于二叉树结构的表达式求值算法
● 表达式包含加减乘除四则运算以及至少一层括弧运算
● 首先将输入的原表达式转换成二叉树结构,然后采用二叉树的后序递归遍历
方法求得表达式的值
● 将所有实验内容合并到一个工程,增加交互操作和循环处理(持续)
2.代码
1.头文件expnbitree .h
装
订 线
1 2 3 4 5 6 7 8 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #include
#include
#include
#define EXP_LEN 100 //定义表达式的最大长度
#define DATA_LEN 20 //定义每个操作数的最大长度
typedef struct BiTNode
{
int dflag; //标志域,值为1,data[]存放操作运算符;值为0,data[]存放操作数char data[DATA_LEN + 1]; //数据域,存放:操作运算符或操作数
struct BiTNode *lchild, *rchild; //分别指向结点的左、右子树
}BiTNode, *BiTree; //定义二叉树结点及二叉树类型指针
int CreateBiTree(BiTree &bt, char *p, int len);
//创建二叉树,并用bt返回树的根地址,p为表达式的首地址,l为表达式的长度
int Calculate(BiTree bt, double &rst);
//计算表达式的值,bt为据表达式创建的二叉树,用rst返回表达式的值
int PreOrderTraverse(BiTree bt);//先序遍历二叉树bt,输出先序遍历序列
int InOrderTraverse(BiTree bt); //中序遍历二叉树bt,输出中序遍历序列
int PostOrderTraverse(BiTree bt); //后序遍历二叉树bt,输出后序遍历序列
int DestroyBiTree(BiTree &bt); //销毁二叉树
//二叉树结构的表达式求解算法入口
void expnbitree();
2.源文件expntree.c
1 2 3 4 5 6 7 8 9
10
11
12
13
14
15
16 #include
#include
#include
#include"expnbitree.h"
//ExpnBiTree实现子程序入口
void expnbitree()
{
int n, len, i; //n标志量,值为0,退出程序;len存储表达式的长度;i一般变量char expn[EXP_LEN + 1]; //存放表达式
double rst; //存放表达式计算结果
BiTree bt = NULL; //声明一个二叉树
gets_s(expn);
do
{
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 i = 0;
printf("请输入合法的表达式:\n");
gets_s(expn);
for (i = 0, len = 0; expn[i] != '\0'; i++) //去掉表达式中的空格,并计算表达式的长度if (expn[i] != ' ')
expn[len++] = expn[i];
expn[len] = '\0';
printf("正在构建二叉树……\n");
if (CreateBiTree(bt, expn, len))
printf("二叉树构建成功!\n");
else
{ //销毁未成功建立的二叉树,释放动态申请的内存
printf("二叉树构建失败!\n");
printf("将销毁二叉树…………");
if (DestroyBiTree(bt))
printf("二叉树销毁成功!\n");
else {
printf("二叉树销毁失败!\n");
exit(0);
}
continue;
}
printf("输出表达式的先序遍历序列……:\n");
PreOrderTraverse(bt);
printf("\n");
printf("输出表达式的中序遍历序列……:\n");
InOrderTraverse(bt);
printf("\n");
printf("输出表达式的后序遍历序列……:\n");
PostOrderTraverse(bt);
printf("\n");
printf("计算表达式的值……:\n");
if (Calculate(bt, rst))
printf("%g\n", rst);
else
printf("计算表达式的值失败!\n");
printf("即将销毁二叉树…………");
if (DestroyBiTree(bt))
printf("二叉树销毁成功!\n");
else {
printf("二叉树销毁失败!\n");
exit(0);
}
printf("如果要继续计算下一个表达式,请输入1,否则,返回上一级:\n ");