逆波兰表达式算法
来源:互联网 发布:网络金融互助平台 编辑:程序博客网 时间:2024/04/27 22:30
将一个中序表达式转化成为逆波兰表达式的方法其实很简单,也是一个成型的算法。通过逆波兰表达式求一个计算式子的值,也是很简单的,只要遇到过会用就行了。
1、将一个中序表达式转化成为逆波兰表达式。
首先维护的是两个栈,我们这里暂且称为S1和S2,S1中的结果最后存的就是逆波兰表达式,S2中将用于暂时存放运算符并且在最终形成逆波兰表达式的时候,该栈是会清空的。下面我们看看怎样具体的形成逆波兰表达式。
在此首先定义一下运算符的优先级关系,从小到达排序,相同优先级没有用逗号隔开:(,+-,*\,负号,)。
从左至右遍历一个给定的中序表达式,也就是我们常规的数学计算的表达式。
(1)如果遇到的是数字,我们直接加入到栈S1中;
(2)如果遇到的是左括号,则直接将该左括号加入到栈S2中;
(3)如果遇到的是右括号,那么将栈S2中的运算符一次出栈加入到栈S1中,直到遇到左括号,但是该左括号出栈S2并不加入到栈S1中;
(4)如果遇到的是运算符,包括单目运算符和双目运算符,我们按照下面的规则进行操作:
(1)如果此时栈S2为空,则直接将运算符加入到栈S2中;
(2)如果此时栈S2不为空,当前遍历的运算符的优先级大于等于栈顶运算符的优先级,那么直接入栈S2;
(3)如果此时栈S2不为空,当前遍历的运算符的优先级小于栈顶运算符的优先级,则将栈顶运算符一直出栈加入到栈S1中,直到栈为空或者遇到一个运算符的优先级小于等于当前遍历的运算符的优先级,此时将该运算符加入到栈S2中;
(5)直到遍历完整个中序表达式之后,栈S2中仍然存在运算符,那么将这些运算符依次出栈加入到栈S1中,直到栈为空。
按照上面的五条操作反复进行完成,那么栈S1中存放的就是逆波兰表达式。
2、利用逆波兰表达式求值
利用逆波兰表达式求计算式的值其实很简单,正式因为这一点,所以逆波兰表达式才在编译原理中被用于计算一个表达式的值。
下面来具体看看如何求一个逆波兰表达式的值:
我们此时维护一个数据结果栈S3,我们将会看到该栈中最后存放的是最终的表达式的值。我们从左至右的遍历栈S1,然后按照下面的规则进行操作栈S3.
(1)如果遇到的是数字,那么直接将数字压入到S3中;
(2)如果遇到的是单目运算符,那么取S3栈顶的一个元素进行单目运算之后,将结果再次压入到栈S3中;
(3)如果遇到的是双目运算符,那么取S3栈顶的两个元素进行,首先出栈的在左,后出栈的在右进行双目运算符的计算,将结果再次压入到S3中。
按照上面的三个规则,遍历完整个栈S1,那么最后S3中的值就是逆波兰表达式的值了,所以我们可以看出来使用逆波兰表达式进行求值是很简单的,只有两种操作要么是直接压栈,要么是运算之后将结果压栈。
- 逆波兰表达式算法
- 逆波兰表达式算法
- 逆波兰表达式算法
- 逆波兰表达式算法
- 逆波兰表达式算法
- 逆波兰表达式算法
- 逆波兰表达式算法实现
- 波兰、逆波兰表达式
- 东北师大算法小组--803:逆波兰表达式
- 算法学习一之逆波兰表达式
- 逆波兰表达式的转化算法
- 调度场算法与逆波兰表达式
- 算法学习-逆波兰表达式RPN
- 编译原理-逆波兰表达式JAVA算法
- 《数据结构和算法》之逆波兰表达式
- 算法学习之递归--逆波兰表达式
- 波兰表达式和逆波兰表达式
- 波兰表达式和逆波兰表达式
- iOS设置同一个Label的不同颜色的字体
- Google浏览器开启手机调试模式
- linux Nginx重启、启动、停止
- 协议森林03 IP接力赛 (IP, ARP, RIP和BGP协议)
- rabbitmq(一)--概述
- 逆波兰表达式算法
- sp_send_dbmail 详解
- Command 模式
- aop:aspectj-autoproxy, SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- C---格式化日期函数
- 表达式计算器
- indexer和searchd的使用
- DisplayMetrics 获取屏幕的宽高(像素)
- 把网页加载进安卓显示,及其android系统webview控件使用详解