第11周项目2-用二叉树求解代数表达式

来源:互联网 发布:js获取所有input的值 编辑:程序博客网 时间:2024/05/18 03:39
  1. /*  
  2. Copyright (c)2016,烟台大学计算机与控制工程学院  
  3. All rights reserved.  
  4. 文件名称:项目2.cbp  
  5. 作    者:陈晓琳
  6. 完成日期:2016年11月10日  
  7. 版 本 号:v1.0   
  8. 问题描述:用二叉树来表示代数表达式,树的每一个分支节点代表一个运算符,每一个叶子节点代表一个运算数(为简化,只支持二目运算  
  9.           的+、-、*、/,不加括号,运算数也只是一位的数字字符。本项目只考虑输入合乎以上规则的情况)。请设计算法,(1)根据形  
  10.           如“1+2*3?4/5”的字符串代表的表达式,构造出对应的二叉树(如图),用后序遍历的思路计算表达式的值时,能体现出先乘除后  
  11.           加减的规则;(2)对构造出的二叉树,计算出表达式的值。   
  12.   
  13. 输入描述:无  
  14. 程序输出:测试数据  
  15. */    
代码:

头文件及功能函数见【二叉树算法库】

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <malloc.h>  
  4. #include "btree.h"  
  5.   
  6. //用s[i]到s[j]之间的字符串,构造二叉树的表示形式  
  7. BTNode *CRTree(char s[],int i,int j)  
  8. {  
  9.     BTNode *p;  
  10.     int k,plus=0,posi;  
  11.     if (i==j)    //i和j相同,意味着只有一个字符,构造的是一个叶子节点  
  12.     {  
  13.         p=(BTNode *)malloc(sizeof(BTNode));   //分配存储空间  
  14.         p->data=s[i];                         //值为s[i]  
  15.         p->lchild=NULL;  
  16.         p->rchild=NULL;  
  17.         return p;  
  18.     }  
  19.     //以下为i!=j的情况  
  20.     for (k=i; k<=j; k++)  
  21.         if (s[k]=='+' || s[k]=='-')  
  22.         {  
  23.             plus++;  
  24.             posi=k;              //最后一个+或-的位置  
  25.         }  
  26.     if (plus==0)                 //没有+或-的情况(因为若有+、-,前面必会执行plus++)  
  27.         for (k=i; k<=j; k++)  
  28.             if (s[k]=='*' || s[k]=='/')  
  29.             {  
  30.                 plus++;  
  31.                 posi=k;  
  32.             }  
  33.     //以上的处理考虑了优先将+、-放到二叉树较高的层次上  
  34.     //由于将来计算时,运用的是后序遍历的思路  
  35.     //处于较低层的乘除会优先运算  
  36.     //从而体现了“先乘除后加减”的运算法则  
  37.     //创建一个分支节点,用检测到的运算符作为节点值  
  38.     if (plus!=0)  
  39.     {  
  40.         p=(BTNode *)malloc(sizeof(BTNode));  
  41.         p->data=s[posi];                //节点值是s[posi]  
  42.         p->lchild=CRTree(s,i,posi-1);   //左子树由s[i]至s[posi-1]构成  
  43.         p->rchild=CRTree(s,posi+1,j);   //右子树由s[poso+1]到s[j]构成  
  44.         return p;  
  45.     }  
  46.     else       //若没有任何运算符,返回NULL  
  47.         return NULL;  
  48. }  
  49.   
  50. double Comp(BTNode *b)  
  51. {  
  52.     double v1,v2;  
  53.     if (b==NULL)  
  54.         return 0;  
  55.     if (b->lchild==NULL && b->rchild==NULL)  //叶子节点,应该是一个数字字符(本项目未考虑非法表达式)  
  56.         return b->data-'0';    //叶子节点直接返回节点值,结点中保存的数字用的是字符形式,所以要-'0'  
  57.     v1=Comp(b->lchild); //先计算左子树  
  58.     v2=Comp(b->rchild); //再计算右子树  
  59.     switch(b->data)     //将左、右子树运算的结果再进行运算,运用的是后序遍历的思路  
  60.     {  
  61.     case '+':  
  62.         return v1+v2;  
  63.     case '-':  
  64.         return v1-v2;  
  65.     case '*':  
  66.         return v1*v2;  
  67.     case '/':  
  68.         if (v2!=0)  
  69.             return v1/v2;  
  70.         else  
  71.             abort();  
  72.     }  
  73. }  
  74.   
  75. int main()  
  76. {  
  77.     BTNode *b;  
  78.     char s[MaxSize]="1+2*3-4/5";  
  79.     printf("代数表达式%s\n",s);  
  80.     b=CRTree(s,0,strlen(s)-1);  
  81.     printf("对应二叉树:");  
  82.     DispBTNode(b);  
  83.     printf("\n表达式的值:%g\n",Comp(b));  
  84.     DestroyBTNode(b);  
  85.     return 0;  
  86. }  
运行结果:


知识点总结:

 二叉树算法库的应用。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 学历认证待校对怎么办 毕业证上没照片怎么办 怎么办学历学位认证证明 教育部学历学位认证怎么办 兵役登记被注册怎么办 学信网手机号忘了怎么办 注销手机号了学信网怎么办 学信网手机换了怎么办 学籍不在籍结业怎么办 电教馆的幼师证怎么办 中考不够建档线怎么办 医保漏交一年怎么办 南通图书馆怎么办饭卡 工商银行卡坏了怎么办 北京一卡通丢了怎么办 甲状腺右叶结节怎么办 ca证书掉了怎么办 地税ca丢了怎么办 南京乘车卡丢失怎么办 老干妈瓶盖打不开怎么办 金陵图书馆书丢失怎么办 幼师资格证丢了怎么办 双证毕业没有怎么办 幼师面试没特长怎么办 资格证到6年没换怎么办 中央巡视组走了怎么办 校园招聘学生违约怎么办 应届毕业生考上公务员档案怎么办 移动硬盘弹不出来怎么办 录音笔电池坏了怎么办 上不吃大厕怎么办 跨考研究生面试怎么办 手机信息查重怎么办 闲鱼不予申诉怎么办 广东理工职业学院没选到课怎么办 淘宝开店认证后怎么办 手机微信解冻怎么办 微信永久封号怎么办 拒绝微信登录怎么办 微信支付冻结怎么办 微信被冻结了钱怎么办