1、/计算表达式的值,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.c2425262728293031323334353
2、637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615
3、715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625
4、7258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354#include
5、expnbitree.h/ExpnBiTree实现子程序入口void expnbitree() int n, len, i; /n标志量,值为0,退出程序;len存储表达式的长度;i一般变量 char expnEXP_LEN + 1; /存放表达式 double rst; /存放表达式计算结果 BiTree bt = NULL; /声明一个二叉树 gets_s(expn); do i = 0; printf(请输入合法的表达式:n); gets_s(expn); for (i = 0, len = 0; expni != 0; i+) /去掉表达式中的空格,并计算表达式的长度 if (expn
6、i ! ) expnlen+ = expni; expnlen = 正在构建二叉树n if (CreateBiTree(bt, expn, len) printf(二叉树构建成功! else /销毁未成功建立的二叉树,释放动态申请的内存二叉树构建失败!将销毁二叉树 if (DestroyBiTree(bt) printf(二叉树销毁成功! else 二叉树销毁失败! exit(0); continue; 输出表达式的先序遍历序列: PreOrderTraverse(bt);输出表达式的中序遍历序列: InOrderTraverse(bt);输出表达式的后序遍历序列: PostOrderTrav
7、erse(bt);计算表达式的值: if (Calculate(bt, rst)%gn, rst);计算表达式的值失败!即将销毁二叉树 if (DestroyBiTree(bt) else exit(0);如果要继续计算下一个表达式,请输入1,否则,返回上一级:n scanf_s(%d, &n); getchar(); while (n=1);/创建二叉树bt, char *p, int len) int i = 0, lnum = 0, rpst1 = -1, rpst2 = -1, pn = 0; /lnum记录(的未成对个数; /rpst1/rpst2记录表达式中优先级最低的(*、/)/
8、(+-)的位置; /pn记录操作数中.的个数,以判断输入操作数是否合法 if (len = 0) return 1; if (!(bt = (BiTree)malloc(sizeof(BiTNode) 内存申请失败n return 0; else /初始化 bt-lchild = bt-rchild = NULL; memset(bt-data, , sizeof(bt-data);/memset是计算机中C/C+语言函数memset(void *s,int ch,size_t n); /将s所指向的某一块内存中的后n个字节的内容全部设置为ch指定的ASCII值, /第一个值为指定的内存地址,
9、块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为s。dflag = 1; /默认bt为叶子节点(即,存放操作数) /合法性检查 if (*p = + | *p = */.) /表达式首不合法; 表达式输入错误! return 0; if (!(*(p + len - 1) = | *(p + len - 1) 0&*(p + len - 1) 9) /不为右括弧或数字,则表达式尾不合法;表达式输入错误! if (len = 1) /此时只有表达式为数字,表达式才合法 if (*p) return 0; bt-data0 = *p; return 1; else i
10、f (len = 2) /此时只有表达式为正数或负数,表达式才合法 if (*p = - | *p *p *(p + 1) data1 = *(p + 1); /表达式合法,开始创建二叉树 if (*p = ( lnum+; for (i = 1; i *(p + i - 1) lnum-; if (lnum -1)/+ -dflag = 0; /data存放操作数data0 = *(p + rpst2); if (CreateBiTree(bt-lchild, p, rpst2) if (CreateBiTree(bt-rchild, p + rpst2 + 1, len - rpst2 -
11、 1) return 1; if (rpst1 1) printf( return 0; bt-datai = *(p + i); else /此时表达式首一定是操作符,其余部分被一对括弧括起来 bt-data0 = if (CreateBiTree(bt-rchild, p + 2, len - 3) return 1; else return 0; else /此时表明表达式为几个因子想成或相除而组成的data0 = *(p + rpst1);lchild, p, rpst1)rchild, p + rpst1 + 1, len - rpst1 - 1)/计算表达式rst) double
12、l = 0, r = 0;/l、r分别存放左右子树所代表的字表达式的值bt) rst = 0; if (bt-dflag = 1) rst = atof(bt-data);/atof(),是C语言标准库中的一个字符串处理函数,/功能是把字符串转换成浮点数, /所使用的头文件为lchild, l)/后序 if (Calculate(bt-rchild, r) switch (bt-data0) case : rst = l + r; break; rst = l - r; rst = l*r; if (r = 0) printf(除数为0 ! return 0; else rst = l / r
13、; break; default: return 0; /printf(%g%c%g=%gn,l,bt-data0,r,rst);/输出运算过程/先序遍历二叉树int PreOrderTraverse(BiTree bt) if (bt)%s , bt- if (PreOrderTraverse(bt-lchild) if (PreOrderTraverse(bt-rchild) return 1;/中序遍历二叉树int InOrderTraverse(BiTree bt) if (InOrderTraverse(bt- if (InOrderTraverse(bt-/后序遍历二叉树int PostOrderTraverse(BiTree bt) if (PostOrderTraverse(bt- if (PostOrderTraverse(bt- else return 0;/销
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1