博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
表达式求值(二叉树方法/C++语言描述)(三)
阅读量:5249 次
发布时间:2019-06-14

本文共 1769 字,大约阅读时间需要 5 分钟。

  二叉树方法求值对运算数处理的方法与栈方法求值不太相同,除了将字符串中的运算数转换为浮点类型外,还需要生成新的节点:

1 void Calculator::dealWithNumber(char *&pToken) throw(string) 2 { 3     if (!isdigit(*pToken) && *pToken != '-') 4     { 5         throw string("bad token '") + *pToken + "'"; 6     } 7  8     BinaryTreeNode
* node = new BinaryTreeNode
(); 9 assert(node);10 node->_data._type = NUMBER;11 node->_data._data.num = strtod(pToken, &pToken);12 node->_leftChild = node->_rightChild = nullptr;13 _stkNodes.push(node);14 }

  对其他token的处理则和栈方法求值类似,请参考代码清单,这里不再赘述。

  公有方法calculate()直接调用了postOrder()方法,调用前清空用于存储浮点类型的栈,方法返回后这个栈的栈顶元素即为运算结果:

1 double Calculator::calculate() 2 { 3     while (!_stkNumbers.empty()) 4     { 5         _stkNumbers.pop(); 6     } 7  8     BinaryTree::postOrder(); 9 10     assert(!_stkNumbers.empty());11     return _stkNumbers.top();12 }

  postOrder()方法重写了从BinaryTree类继承的postOrder()方法,它在后序遍历时遇到运算数则压栈,遇到运算符则弹栈计算:

1 void Calculator::postOrder(BinaryTreeNode
*node) 2 { 3 if (node) 4 { 5 postOrder(node->_leftChild); 6 postOrder(node->_rightChild); 7 // visit binary tree data 8 if (node->_data._type == NUMBER) 9 {10 _stkNumbers.push(node->_data._data.num);11 }12 else13 {14 assert(!_stkNumbers.empty());15 double d2 = _stkNumbers.top();16 _stkNumbers.pop();17 assert(!_stkNumbers.empty());18 double d1 = _stkNumbers.top();19 _stkNumbers.pop();20 char op = node->_data._data.op;21 _stkNumbers.push(calculate(d1, op, d2));22 }23 }24 }

静态方法calculate()与栈方法求值中的也相同。

  最后编写主函数,大功告成!

转载于:https://www.cnblogs.com/lets-blu/p/7291552.html

你可能感兴趣的文章
前端各种mate积累
查看>>
Python(软件目录结构规范)
查看>>
Windows多线程入门のCreateThread与_beginthreadex本质区别(转)
查看>>
Nginx配置文件(nginx.conf)配置详解1
查看>>
linux php编译安装
查看>>
redis哨兵集群、docker入门
查看>>
hihoCoder 1233 : Boxes(盒子)
查看>>
codeforces水题100道 第二十二题 Codeforces Beta Round #89 (Div. 2) A. String Task (strings)
查看>>
c++||template
查看>>
[BZOJ 5323][Jxoi2018]游戏
查看>>
条件断点 符号断点
查看>>
Python Web框架Django (五)
查看>>
.net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串------(转)...
查看>>
python的多行注释
查看>>
连接Oracle需要jar包和javadoc文档的下载
查看>>
UVA 10976 - Fractions Again?!
查看>>
Dreamweaver cc新版本css单行显示
查看>>
【android】安卓的权限提示及版本相关
查看>>
JavaScript可否多线程? 深入理解JavaScript定时机制
查看>>
IOS基础学习
查看>>