表达式求值(二叉树方法/C++语言描述)(三)
二叉树方法求值对运算数处理的方法与栈方法求值不太相同,除了将字符串中的运算数转换为浮点类型外,还需要生成新的节点:
void Calculator::dealWithNumber(char *&pToken) throw(string)
{
if (!isdigit(*pToken) && *pToken != '-')
{
throw string("bad token '") + *pToken + "'";
} BinaryTreeNode<Token> * node = new BinaryTreeNode<Token>();
assert(node);
node->_data._type = NUMBER;
node->_data._data.num = strtod(pToken, &pToken);
node->_leftChild = node->_rightChild = nullptr;
_stkNodes.push(node);
}
对其他token的处理则和栈方法求值类似,请参考代码清单,这里不再赘述。
公有方法calculate()直接调用了postOrder()方法,调用前清空用于存储浮点类型的栈,方法返回后这个栈的栈顶元素即为运算结果:
double Calculator::calculate()
{
while (!_stkNumbers.empty())
{
_stkNumbers.pop();
} BinaryTree::postOrder(); assert(!_stkNumbers.empty());
return _stkNumbers.top();
}
postOrder()方法重写了从BinaryTree类继承的postOrder()方法,它在后序遍历时遇到运算数则压栈,遇到运算符则弹栈计算:
void Calculator::postOrder(BinaryTreeNode<Token> *node)
{
if (node)
{
postOrder(node->_leftChild);
postOrder(node->_rightChild);
// visit binary tree data
if (node->_data._type == NUMBER)
{
_stkNumbers.push(node->_data._data.num);
}
else
{
assert(!_stkNumbers.empty());
double d2 = _stkNumbers.top();
_stkNumbers.pop();
assert(!_stkNumbers.empty());
double d1 = _stkNumbers.top();
_stkNumbers.pop();
char op = node->_data._data.op;
_stkNumbers.push(calculate(d1, op, d2));
}
}
}
静态方法calculate()与栈方法求值中的也相同。
最后编写主函数,大功告成!
表达式求值(二叉树方法/C++语言描述)(三)的更多相关文章
- 表达式求值(二叉树方法/C++语言描述)(二)
表达式二叉树节点的数据可能是运算数或运算符,可以使用一个联合体进行存储:同时还需要一个变量来指示存储的是运算数还是运算符,可以采用和栈方法求值中一样的枚举类型TokenType: typedef en ...
- 表达式求值(二叉树方法/C++语言描述)(一)
使用二叉树对算数表达式(以下简称为表达式)进行求值,实质上是将表达式转换为二叉树,对其进行后序遍历,得到后缀表达式的同时可以求得表达式的值.转换和求值的过程也需要借助数据结构栈的帮助. 二叉树数据结构 ...
- 表达式求值(二叉树方法/C++语言描述)(五)
本例中的二叉树图是使用Graphviz绘制的(Graphviz官网),在Ubuntu Linux下可以使用apt-get命令安装它: sudo apt-get install graphviz 表达式 ...
- 表达式求值(二叉树方法/C++语言描述)(四)
代码清单 // binarytree.h #ifndef BINARYTREE_H #define BINARYTREE_H template <typename T> class Bin ...
- 表达式求值--数据结构C语言算法实现
这篇博客介绍的表达式求值是用C语言实现的,只使用了c++里面的引用. 数据结构课本上的一个例题,但是看起来很简单,实现却遇到了很多问题. 这个题需要构建两个栈,一个用来存储运算符OPTR, 一个用来存 ...
- LeetCode:逆波兰表达式求值【150】
LeetCode:逆波兰表达式求值[150] 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除 ...
- 表达式求值(栈方法/C++语言描述)(二)
上篇中完成了对表达式求值的整体过程,接下来看看如何处理不同类型的token. 对运算数的处理比较简单,它直接调用函数strtod(),将字符串中的运算数转换为浮点类型并将它压入运算数栈中: void ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- Java描述表达式求值的两种解法:双栈结构和二叉树
Java描述表达式求值的两种解法:双栈结构和二叉树 原题大意:表达式求值 求一个非负整数四则混合运算且含嵌套括号表达式的值.如: # 输入: 1+2*(6/2)-4 # 输出: 3.0 数据保证: 保 ...
随机推荐
- JMS 之 Active MQ 启动嵌入式Broke
一.如何启动active MQ 服务 (一).使用命令启动 /bin 目录下 ./activemq start 默认使用conf/activemq.xml 配置文件 b.[root@localhost ...
- 伞兵(Paratroopers)
伞兵(Paratroopers) 时间限制: 1 Sec 内存限制: 128 MB 题目描述 公元 2500 年,地球和火星之间爆发了一场战争.最近,地球军队指挥官获悉火星入侵者将派一些伞兵来摧毁地 ...
- Maven转化为Dynamic Web Module
如今Maven仍然是最常用的项目管理工具,若要将Java Web项目使用Maven进行管理,则首先需要新建Maven项目,然后将其转化为web项目. 在项目右键选择properties,然后点击左侧P ...
- Tomcat中部署web应用 ---- Dubbo服务消费者Web应用war包的部署
样例视频:http://www.roncoo.com/course/view/f614343765bc4aac8597c6d8b38f06fd IP: 192.168.2.61 部署容器:apache ...
- jQuery星级评分插件
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta http-equiv="Con ...
- 【Android Developers Training】 51. 序言:打印内容
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 2.如何实现使用VBS脚本程序对直播间自动评论
前言:本文使用的是VBS脚本,实现了对繁星直播自动登录,自动进入房间并且自动评论. 前提准备:把需要刷的评论放到mysql中,再使用vbs读出评论 -------------------------- ...
- nodejs模块学习: connect解析
nodejs模块学习: connect解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固,需要开发者创造大量的轮子来解决 ...
- 关于IO流代码BufferedReader
package JBJADV003;import java.io.*;public class BufferedReaderTest { /** * @param args */ public sta ...
- 【Stack Overflow -- 原创加工、原创整理、生产实战】-- 深度复制
一.说明 1.本程序的核心代码不是我原创的,是我在Stack Overflow上搜集后加工出来的,原作者已忘记了~ 2.这段程序是我在上海携程(2014年左右)上班时整理并在生产环境应用的,先后经历了 ...