基于二叉树结构的表达式求值算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 ");

相关文档
最新文档