二叉树的应用 表达式处理_C++二叉树应用:计算表达式

本文介绍了如何使用二叉树处理计算表达式的问题,强调了遇到疑惑时应当动手验证的重要性。通过改进代码,实现了正确处理括号的表达式计算,通过设置flag来确保括号内的运算得到正确处理。
摘要由CSDN通过智能技术生成

昨天晚上,我花了大把的时间研究里面二叉树应用解决计算表达式的问题,一直就没理解,主要是觉得是不是自己错了,又懒,不愿意自己把代码敲到电脑里看看,结果浪费了很多时间。所以还是提醒大家,代码这种东西,有什么好多看的,觉得他错了就自己敲到电脑里去看看!其实也没错太多,就是少了一些东西,导致原代码里的括号完全没有意义,也就是说,书中的代码虽然考虑到了计算表达式中的括号,却什么都没有做,而这其实只要稍稍改进:加一个flag存储上次读到的char,如果是‘)’的话,就要把左式当成运算数来计算

  好了,把正确的代码贴在下面:

 #include   using namespace std;  class calc  {  enum Type {DATA, ADD, SUB, MULTI, DIV, OPAREN, CPAREN, EOL};  struct node  {  Type type;  int data;  node *lchild, *rchild;  node(Type t, int d=0, node *lc=NULL, node *rc=NULL)  {  type=t; data=d; lchild=lc; rchild=rc;  }  };  node *root;  node *create(char * &s);  Type getToken (char * &s, int &value);  int result (node *t);  public:  calc (char *s) {root=create(s);}  int result() {if (root==NULL) return 0;  return result(root);}  };  calc::node *calc::create(char * &s)  {  node *p, *root=NULL;  Type returnType,flag=DATA;  int value;  while (*s)  {  flag=returnType;  returnType=getToken(s,value);  switch (returnType)  {  case DATA:  case OPAREN:  if (returnType == DATA) p=new node(DATA,value);  else p=create(s);  if (root==NULL) root=p;  else if (root->rchild==NULL) root->rchild=p;  else root->rchild->rchild=p;  break;  case CPAREN:  case EOL: return root;  case ADD:  case SUB:  root=new node(returnType,0,root);  break;  case MULTI:  case DIV:  if (root->type==DATA || root->type==MULTI || root->type==DIV || flag==OPAREN)  root=new node(returnType,0,root);  else root->rchild=new node(returnType,0,root->rchild);  }  }  return root;  }  calc::Type calc::getToken(char *&s, int &data)  {  char type;  while (*s==' ') ++s;  if (*s>='0' && *s<='9')  {  data=0;  while (*s>='0' && *s<='9') {data=data*10+ *s-'0'; ++s;}  return DATA;  }  if (*s == '0') return EOL;  type =*s; ++s;  switch(type)  {  case '+':return ADD;  case '-':return SUB;  case '*':return MULTI;  case '/':return DIV;  case '(':return OPAREN;  case ')':return CPAREN;  default: return EOL;  }  }  int calc::result(node *t)  {  int num1,num2;  if (t->type == DATA) return t->data;  num1=result(t->lchild);  num2=result(t->rchild);  switch(t->type)  {  case ADD:t->data=num1+num2;break;  case SUB:t->data=num1-num2;break;  case MULTI: t->data=num1*num2;break;  case DIV:t->data=num1/num2;break;  }  return t->data;  }  int main()  {  char equation[256];  cin>>equation;  //calc exp("3*(2+(6/2))");  calc exp(equation);  cout<
4a6895bee93a69fe38c54be0c612e455.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 矩阵运算1 1.1 实矩阵相乘1 1.2 复矩阵相乘4 1.3 一般实矩阵求逆8 1.4 一般复矩阵求逆13 1.5 对称正定矩阵的求逆18 1.6 托伯利兹矩阵求逆的特兰持方法21 1.7 求一般行列式的值25 1.8 求矩阵的秩29 1.9 对称正定矩阵的乔里斯基分解与行列式求值33 1.10 矩阵的三角分解36 1.11 一般实矩阵的QR分解41 1.12 一般实矩阵的奇异值分解46 1.13 求广义逆的奇异值分解法61 第2章 矩阵特征值与特征向量的计算75 2.1 求对称三对角阵的全部特征值与特征向量75 2.2 求实对称矩阵全部特征值与特征向量的 豪斯荷尔德变换法80 2.3 求赫申伯格矩阵全部特征值的QR方法88 2.4 求一般实矩阵的全部特征值95 2.5 求实对称矩阵特征值与特征向量的雅可比法102 2.6 求实对称矩阵特征值与特征向量的雅可比过关法109 第3章 线性代数方程组的求解115 3.1 求解实系数方程组的全选主元高斯消去法115 3.2 求解实系数方程组的全选主元高斯\|约当消去法119 3.3 求解复系数方程组的全选主元高斯消去法124 3.4 求解复系数方程组的全选主元高斯\|约当消去法129 3.5 求解三对角线方程组的追赶法135 3.6 求解一般带型方程组139 3.7 求解对称方程组的分解法146 3.8 求解对称正定方程组的平方根法151 3.9 求解托伯利兹方程组的列文逊方法155 3.10 高斯\|赛德尔迭代法161 3.11 求解对称正定方程组的共轭梯度法165 3.12 求解线性最小二乘问题的豪斯荷尔德变换法169 3.13 求解线性最小二乘问题的广义逆法175 3.14 求解病态方程组189 第4章 非线性方程与方程组的求解195 4.1 求非线性方程实根的对分法195 4.2 求非线性方程一个实根的牛顿法198 4.3 求非线性方程一个实根的埃特金迭代法201 4.4 求非线性方程一个实根的试位法204 4.5 求非线性方程一个实根的连分式法206 4.6 求实系数代数方程全部根的QR方法211 4.7 求实系数代数方程全部根的牛顿下山法216 4.8 求复系数代数方程全部根的牛顿下山法225 4.9 求非线性方程组一组实根的梯度法233 4.10 求非线性方程组一组实根的拟牛顿法238 4.11 求非线性方程组最小二乘解的广义逆法246 4.12 求非线性方程一个实根的蒙特卡洛法262 4.13 求实函数或复函数方程一个复根的蒙特卡洛法265 4.14 求非线性方程组一组实根的蒙特卡洛法269 第5章 插值与逼近274 5.1 Lagrange插值274 5.2 连分式插值277 5.3 埃尔米特插值281 5.4 埃特金逐步插值284 5.5 光滑插值288 5.6 第一种边界条件的三次样条函数插值、微商与积分294 5.7 第二种边界条件的三次样条函数插值、微商与积分301 5.8 第三种边界条件的三次样条函数插值、微商与积分307 5.9 二元Lagrange插值314 5.10 最小二乘曲线拟合319 5.11 切比雪夫曲线拟合326 5.12 最佳一致逼近的里米兹方法332 5.13 矩形域的最小二乘曲面拟合337 第6章 数值积分348 6.1 变步长梯形求积法348 6.2 变步长辛卜生求积法351 6.3 自适应梯形求积法353 6.4 龙贝格求积法356 6.5 计算一维积分的连分式法359 6.6 高振荡函数求积法363 6.7 勒让德-高斯求积法368 6.8 拉盖尔-高斯求积法371 6.9 埃尔米特-高斯求积法374 6.10 切比雪夫求积法376 6.11 计算一维积分的蒙特卡洛法379 6.12 变步长辛卜生二重积分法382 6.13 计算多重积分的高斯方法386 6.14 计算二重积分的连分式法391 6.15 计算多重积分的蒙特卡洛法395 第7章 常微分方程组的求解399 7.1 定步长欧拉方法399 7.2 变步长欧拉方法404 7.3 维梯方法409 7.4 定步长龙格-库塔方法414 7.5 变步长龙格-库塔方法419 7.6 变步长基尔方法424 7.7 变步长默森方法430 7.8 连分式法436 7.9 双边法444 7.10 阿当姆斯预报校正法450 7.11 哈明方法456 7.12 特雷纳方法463 7.13 积分刚性方程组的吉尔方法470 7.14 二阶微分方程边值问题的数值解法487 第8章 数据处理494 8.1 随机样本分析494 8.2 一元线性回归分析499 8.3 多元线性回归分析503 8.4 逐步回归分析510 8.5 半对数数据相关521 8.6 对数数据相关525第9章 极值问题的求解529 9.1 一维极值连分式法529 9.2 n维极值连分式法532 9.3 不等式约束线性规划问题538 9.4 求n维极值的单形调优法545 9.5 求约束条件下n维极值的复形调优法552 第10章 复数、多项式与特殊函数的计算562 10.1 复数运算562 10.2 实系数多项式的计算569 10.3 复系数多项式的计算574 10.4 特殊函数的计算581
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值