【Java数据结构的实现】之系列三栈的实现(使用栈计算后缀表达式)
2015-04-17 15:04
225 查看
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://enetq.blog.51cto.com/479739/713534
【Java数据结构的实现】之系列三栈的实现(使用栈计算后缀表达式)
上讲介绍了栈的介绍,最后并给出了栈的抽象数据类型
1.1本章学习目标
中、后缀表达式简介
后缀表达式的实现
本文介绍了栈的实例--使用栈计算后缀表达式:
1.2 中、后缀表达式简介
①中缀表达式:
通常,算术表达式写作中缀表达式,,什么是中缀表达式呢?中缀表达式就是:操作符位于操作数之间。
如下形式:
<操作数><操作符><操作数>
例如表达式:1+2*3,计算时,我们根据表达式的优先规则来计算。其结果是7而不是9.
那什么是后缀表达式呢?
②后缀表达式:
后缀表达式就是:操作符位于两个操作数之后,后缀表达式的形式如下:
<操作数><操作数><操作符>
如下所示:
1 2 - 等价于1-2
③使用后缀表达式的优点:
后缀表达式比中缀表达式更容易计算,因为它不用考虑优先规则和括弧,表达式中的操作数和操作符的顺序就足以完成计算。
因此程序设计语言编辑器和运行时环境在其内部中往往使用后缀表达式。
④后缀表达式的计算规则:
后缀表达式的计算过程可以概括如下:
从左到右扫描整个表达式,把每个操作符应用到其之前两个相邻的操作数,并计算该结果,剩下的表达式以此类推。
1+2*3
可以转换成后缀表达式如下:
1 2 3 * +
计算过程如下:
1 2*3 + --> 1 6 + -->7
更复杂的后缀表达式,亦是如此规则。由此可以发现,栈是用于计算后缀表达式的理想数据结构。
1.3 后缀表达式的实现
①程序设计的思路:
/**
* 从左到右扫描表达式,以此标识出每个符号(操作数或操作符)。如果是操作数,
* 则把它压入栈中。如果是操作符,则从栈中弹出两个元素,
* 并把该操作符应用在这两个元素只上,然后把操作结果压入栈中。
* 当到达表达式的末尾时,栈中所神域的元素就是该表达式的计算结果。
* @param expr 后缀表达式
* @return int 后缀表达式的值
* */
//------------------------------------------------------------------------------------------------
总结:自己在做这个后缀表达式的时候没有啥思路,原因其实也很简单,对原理不清楚。
写程序的时候,一个知识环境没有,所以写起来一点思路也没有。这里要知道中缀表达式和后缀表达式,
它们如何形成的,又如何利用后缀表达式进行计算的。
(1)后缀表达式,利用栈来保存“操作数”,当遇到“操作符”时弹出栈中的“操作数”,并把计算结果压入栈中,下次计算的时候还需要利用上次的计算结果进行计算。
【Java数据结构的实现】之系列三栈的实现(使用栈计算后缀表达式)
上讲介绍了栈的介绍,最后并给出了栈的抽象数据类型
1.1本章学习目标
中、后缀表达式简介
后缀表达式的实现
本文介绍了栈的实例--使用栈计算后缀表达式:
1.2 中、后缀表达式简介
①中缀表达式:
通常,算术表达式写作中缀表达式,,什么是中缀表达式呢?中缀表达式就是:操作符位于操作数之间。
如下形式:
<操作数><操作符><操作数>
例如表达式:1+2*3,计算时,我们根据表达式的优先规则来计算。其结果是7而不是9.
那什么是后缀表达式呢?
②后缀表达式:
后缀表达式就是:操作符位于两个操作数之后,后缀表达式的形式如下:
<操作数><操作数><操作符>
如下所示:
1 2 - 等价于1-2
③使用后缀表达式的优点:
后缀表达式比中缀表达式更容易计算,因为它不用考虑优先规则和括弧,表达式中的操作数和操作符的顺序就足以完成计算。
因此程序设计语言编辑器和运行时环境在其内部中往往使用后缀表达式。
④后缀表达式的计算规则:
后缀表达式的计算过程可以概括如下:
从左到右扫描整个表达式,把每个操作符应用到其之前两个相邻的操作数,并计算该结果,剩下的表达式以此类推。
1+2*3
可以转换成后缀表达式如下:
1 2 3 * +
计算过程如下:
1 2*3 + --> 1 6 + -->7
更复杂的后缀表达式,亦是如此规则。由此可以发现,栈是用于计算后缀表达式的理想数据结构。
1.3 后缀表达式的实现
①程序设计的思路:
/**
* 从左到右扫描表达式,以此标识出每个符号(操作数或操作符)。如果是操作数,
* 则把它压入栈中。如果是操作符,则从栈中弹出两个元素,
* 并把该操作符应用在这两个元素只上,然后把操作结果压入栈中。
* 当到达表达式的末尾时,栈中所神域的元素就是该表达式的计算结果。
* @param expr 后缀表达式
* @return int 后缀表达式的值
* */
后缀表达式又称为逆波兰表达式。
class PostfixEvaluator { private final char ADD = '+'; private final char SUB = '-'; private final char MUL = '*'; private final char DIV = '/'; private Stack<Integer> stack; public PostfixEvaluator() { stack = new Stack<Integer>(); } // 后缀表达式:3 2 2 * + 1 - // 中缀表达式:3 + 2 * 2 - 1 public int evaluate(String expr) { // 将字符串分解,\s 匹配任何空白字符,包括空格、制表符、换页符等。 String[] tokenizer = expr.split("\\s"); for (int i = 0; i < tokenizer.length; i++) { String token = tokenizer[i].trim(); if (isOperator(token)) { // 判断是操作符,则出栈两个操作数 int op2 = (stack.pop()).intValue(); int op1 = (stack.pop()).intValue(); char operator = token.charAt(0); // 提取操作符+、-、*、/ stack.push(calc(operator, op1, op2)); // 把计算结果压入栈中 } else { stack.push(Integer.parseInt(token)); // 压入操作数 } } return stack.pop(); // 将最后的计算结果返回 } private int calc(char operation, int op1, int op2) { int result = 0; switch (operation) { case ADD: result = op1 + op2; break; case SUB: result = op1 - op2; break; case MUL: result = op1 * op2; break; case DIV: result = op1 / op2; break; } return result; } private boolean isOperator(String token) { return (token.equals("+") || token.equals("-") || token.equals("*") || token .equals("/")); } } public class Ope { public static void main(String[] args) { String expression = "3 2 2 * + 1 -"; PostfixEvaluator evaluator = new PostfixEvaluator(); int result = evaluator.evaluate(expression); System.out.println("计算结果为:" + result); } }
//------------------------------------------------------------------------------------------------
总结:自己在做这个后缀表达式的时候没有啥思路,原因其实也很简单,对原理不清楚。
写程序的时候,一个知识环境没有,所以写起来一点思路也没有。这里要知道中缀表达式和后缀表达式,
它们如何形成的,又如何利用后缀表达式进行计算的。
(1)后缀表达式,利用栈来保存“操作数”,当遇到“操作符”时弹出栈中的“操作数”,并把计算结果压入栈中,下次计算的时候还需要利用上次的计算结果进行计算。
相关文章推荐
- 【Java数据结构的实现】之系列三栈的实现(使用栈计算后缀表达式)
- SPCAMLEditor使用系列(3)--利用SPCamlEditor实现 时间字段跟当前时间进行实时比较计算
- 使用逆波兰式(后缀表达式)实现多功能计算器
- 设计与实现的简单和经常使用的权限系统(五岁以下儿童):不维护节点的深度level,手工计算level,树形结构
- 项目搭建系列之四:SpringMVC框架下使用UrlRewrite实现地址重写
- 使用Matlab从Excel中读取数据并实现回归统计计算
- 使用 ipmitool 实现远程管理Dell 系列服务器
- 数据库分库分表(sharding)系列(三) 关于使用框架还是自主开发以及sharding实现层面的考量
- 使用Hadoop的mapReduce实现计算单词数
- 使用XtraReport的CalculatedFiled(计算字段)实现RDLC报表中表达式
- AR Drone系列之:使用ROS catkin创建package并使用cv_bridge实现对ar drone摄像头数据的处理
- 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第十七节:地表的实现
- STL系列之七 快速计算x的n次幂 power()的实现
- 安卓控件使用系列2:TextView实现图文(图片和文字)混排
- 安卓控件使用系列4:TextView实现跑马灯效果
- 安卓控件使用系列7:AutoCompleteTextView和MultiAutoCompleteTextView实现输入字符自动提醒
- 安卓控件使用系列9:Button实现图文混排
- 安卓控件使用系列16:ImageView实现图片缩放和旋转
- 使用PreparedStatement实现查询操作系列一-----用户登录操作
- shell基础:使用read、命令行脚本传参实现输入2个整数并计算