用二叉树求解代数表达式

本次实践所用到的二叉树算法库点击此处参考 编译环境(VC++6.0)

项目要求如下:

用二叉树来表示代数表达式,树的每一个分支节点代表一个运算符,每一个叶子节点代表一个运算数(为简化,只支持二目运算的+、-、*、/,不加括号,运算数也只是一位的数字字符。本项目只考虑输入合乎以上规则的情况)。请设计算法,(1)根据形如“1+2∗3−4/5”的字符串代表的表达式,构造出对应的二叉树(如图),用后序遍历的思路计算表达式的值时,能体现出先乘除后加减的规则;(2)对构造出的二叉树,计算出表达式的值。 

实现源代码如下:

//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :main.cpp*
//*作者:田长航*
//*完成时间:2017年11月9日*
//*版本号:v1.0*
//*问题描述:测试函数*
//*输入描述:无*
//*程序输出:无*
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include "btree.h"//用s[i]到s[j]之间的字符串,构造二叉树的表示形式
BTNode *CRTree(char s[],int i,int j)
{BTNode *p;int k,plus=0,posi;if (i==j)    //i和j相同,意味着只有一个字符,构造的是一个叶子节点{p=(BTNode *)malloc(sizeof(BTNode));   //分配存储空间p->data=s[i];                         //值为s[i]p->lchild=NULL;p->rchild=NULL;return p;}//以下为i!=j的情况for (k=i; k<=j; k++)if (s[k]=='+' || s[k]=='-'){plus++;posi=k;              //最后一个+或-的位置}if (plus==0)                 //没有+或-的情况(因为若有+、-,前面必会执行plus++)for (k=i; k<=j; k++)if (s[k]=='*' || s[k]=='/'){plus++;posi=k;}//以上的处理考虑了优先将+、-放到二叉树较高的层次上//由于将来计算时,运用的是后序遍历的思路//处于较低层的乘除会优先运算//从而体现了“先乘除后加减”的运算法则//创建一个分支节点,用检测到的运算符作为节点值if (plus!=0){p=(BTNode *)malloc(sizeof(BTNode));p->data=s[posi];                //节点值是s[posi]p->lchild=CRTree(s,i,posi-1);   //左子树由s[i]至s[posi-1]构成p->rchild=CRTree(s,posi+1,j);   //右子树由s[poso+1]到s[j]构成return p;}else       //若没有任何运算符,返回NULLreturn NULL;
}double Comp(BTNode *b)
{double v1,v2;if (b==NULL)return 0;if (b->lchild==NULL && b->rchild==NULL)  //叶子节点,应该是一个数字字符(本项目未考虑非法表达式)return b->data-'0';    //叶子节点直接返回节点值,结点中保存的数字用的是字符形式,所以要-'0'v1=Comp(b->lchild); //先计算左子树v2=Comp(b->rchild); //再计算右子树switch(b->data)     //将左、右子树运算的结果再进行运算,运用的是后序遍历的思路{case '+':return v1+v2;case '-':return v1-v2;case '*':return v1*v2;case '/':if (v2!=0)return v1/v2;elseabort();}
}int main()
{BTNode *b;char s[MaxSize]="1+2*3-4/5";printf("代数表达式%s\n",s);b=CRTree(s,0,strlen(s)-1);printf("对应二叉树:");DispBTNode(b);printf("\n表达式的值:%g\n",Comp(b));DestroyBTNode(b);return 0;
}

运行结果截图如下:


数据结构上机实践第十周项目2 - 用二叉树求解代数表达式相关推荐

  1. 数据结构上机实践第八周项目9-广义表算法库及应用

    广义表算法库及应用 为了丰富算法库,以应对各类工程的需要,本次实践将进行广义表算法库的建立以及应用. 项目要求一: 建立广义表算法库,包括:  ① 头文glist.h,定义数据类型,声明函数:  ② ...

  2. 数据结构上机实践第八周项目2- 建立链串的算法库

    建立链串的算法库 一般每一种数据结构都不会局限于在连续空间内的存取,那我们的串自然也不反常,本次实践将建立链串的算法库,应用于有需求的工程当中,提高程序的容错性. 本次实践依然会用到多文件组织工程的建 ...

  3. 数据结构上机实践第三周项目2 - 建设“顺序表”算法库

    [项目2 - 建设"顺序表"算法库]  领会"0207将算法变程序"部分建议的方法,建设自己的专业基础设施算法库.这一周,建的是顺序表的算法库.  算法库包括两 ...

  4. 数据结构上机实践第七周项目1 - 自建算法库——顺序环形队列

    自建算法库--顺序环形队列 本次实践将建立顺序环形队列的算法库,用于之后的工程中 实现源代码如下: 1.squeue.h /* copyright (t) 2017,烟台大学计算机学院 *All ri ...

  5. 数据结构上机实践第11周项目1 - 图基本算法库

    图基本算法库   本次实践将建立图的基本算法库,用以丰富算法库,灵活应对更多样的工程,所谓"技多不压身",算法亦如此.   本次实践将运用多文件组织工程的建立,点击此处参考.(编译 ...

  6. 数据结构上机实践第五周项目2 - 建立链栈算法库

    建立链栈算法库 链式存储和顺序存储方式各有特点,各有缺点,上次实践建立了顺序栈的算法库,本次实践将建立链栈的算法库,用以应多更多多样化的问题.(编译环境:VC++6.0) 本次建立算法库需要建立多文件 ...

  7. 数据结构上机实践第五周项目1- 建立顺序栈算法库

    建立顺序栈算法库 本次实践将建立顺序栈的算法库,用以解决更多的工程问题,提供便利.(编译环境:VC++6.0) 建立算法库将会用到多文件组织工程的建立,本次实践不再细说,点击此处可参考. 建立好的工程 ...

  8. 数据结构上机实践第八周项目8-稀疏矩阵的三元组表示的实现及应用

    稀疏矩阵的三元组表示的实现及应用 在现代社会中,在一个大量的人群集体中,总会有和某个人有相互之间的关系或者单向关系的,那我们的矩阵也是如此,稀疏矩阵压缩存储的方式,便可以让这种关系一目了然,巧妙应用. ...

  9. 数据结构上机实践第八周项目7—对称矩阵的压缩存储及基本运算

    对称矩阵的压缩存储及基本运算 贺老师的慕课当中,给我们拓展了这样的知识. 所以,本次的项目实践要求如下: 用压缩形式存储对称矩阵,实现下面的操作并测试 void Init(int *&b);/ ...

最新文章

  1. linux下备份mysql上传到网盘_Linux命令行上传文件到百度网盘
  2. DeeCamp 2020 赛题大公开!快来看你想选哪个
  3. 协方差、相关系数---通俗解释
  4. mysql connector c编程_MySQL数据库之MySQL Connector 编程
  5. 【报告分享】2020年中国知识图谱行业研究报告.pdf(附下载链接)
  6. JTAG TAP Controller
  7. select top语句 mysql_SQL SELECT TOP 语句
  8. dialog的二次封装
  9. edius隐藏快捷键_EDIUS7 Pro快捷键使用方法及全部快捷键功能
  10. 美团笔试--修改矩阵
  11. fluent使用DPM模型计算出的颗粒沉积(trap)数据(.dpm格式)后处理python实现
  12. 【笔试题】网易2018秋招内推笔试
  13. 模拟电话交换机和IPPBX之间进行连接
  14. excel--转化IP地址为十进制
  15. “小度小度”开启AI硬件的“量贩”时代
  16. ubuntu16.04 安装VScode
  17. Python数据分析之证券之星沪深A股基本信息爬取与分析
  18. Error: Flutter plugin not installed; this adds Flutter specific functionality. - Flutter
  19. 白社会VS开心-对比评测
  20. early_param分析

热门文章

  1. python后台架构Django教程——admin管理员站点
  2. c++数学函数运算,浮点数据相等判断
  3. MySQL(一)面试集合
  4. HTML基础【1】:认识 HTML
  5. cobalt strike
  6. C#编程(六十六)----------表达式树总结
  7. 1. 少了一个PermMissingElem Find the missing element in a given permutation.
  8. WPF采用MVVM模式(绑定:纯前台、命令:触发器绑定命令)
  9. 读jQuery源码 jQuery.data
  10. vbs中的WScript.Network[属性与方法]