逆波兰式也就是后缀式 简单介绍
2012-09-26 10:03
225 查看
原表达式:a*(b*(c+d/e)-f)# /* # 为表达式结束符号*/
后缀式:abcde/+*f-x#
为运算符定义优先级:# ( + - * / **
-1 0 1 1 2 2 3
从原表达式求后缀式的规则为:
1.设定运算符栈
2.假设表达式的结束符为"#",我们需要预设运算符栈底元素为"#"
3.扫描表达式,若当前字符是操作数,则直接发送给后缀表达式;
4.若当前字符为运算符且优先级大于栈顶运算符,则进栈,否则退出栈顶运算符并将其发送给后缀式。然后将当前运算符放入栈中。
5.若当前字符是结束符,则将栈中的全部运算符依次发送给后缀式。
6.若当前字符为"(",进栈。
7.若当前字符为")",则从栈顶起,依次将栈中运算符出栈发送给ie后缀式,直到碰到"("。将栈中"("出栈,不需要发送给后缀式。然后继续扫描表达式。
举例 下面以(a+b)*c为例子进行说明:
(a+b)*c的逆波兰式为ab+c*,假设计算机把ab+c*按从左到右的顺序压入栈中,并且按照遇到运算符就把栈顶两个元素出栈,执行运算,得到的结果再入栈的原则来进行处理,那么ab+c*的执行结果如下:
1)a入栈(0位置)
2)b入栈(1位置)
3)遇到运算符“+”,将a和b出栈,执行a+b的操作,得到结果d=a+b,再将d入栈(0位置)
4)c入栈(1位置)
5)遇到运算符“*”,将d和c出栈,执行d*c的操作,得到结果e,再将e入栈(0位置)
经过以上运算,计算机就可以得到(a+b)*c的运算结果e了。
逆波兰式除了可以实现上述类型的运算,它还可以派生出许多新的算法,数据结构,这就需要灵活运用了。逆波兰式只是一种序列体现形式。
结论:1,操作数之间的相对顺序不变,运算符的相对次序不同。
2,中缀表达式是没有意义的,去除了括弧。导致运算结果不一致。
3,前缀式的运算规则是:
连续出现的两个操作数和它们之前且紧靠它们的运算符构成一个最小表达式。可以用前缀式求值。
4,后缀式的运算规则刚好与前缀式相反。
运算符在式中的顺序恰为表达式的运算顺序,(先做乘法,除法,然后加法)每个运算符和在它之前出现且紧靠它的两个操作数构成一个最小表达式。
后缀式转成原表达式。
依次入栈,遇到运算符,将两个操作数出栈运算,结果再次放到栈顶。依次循环。
从原表达式求的后缀式?
出现了后面的操作数才能确定前面的运算。
注意:左边图上应该是设立运算符栈
每个运算符的运算次序要由它之前的一个运算符来定,在后缀式中,优先级高的运算符领先于优先级低的运算符
后缀式:abcde/+*f-x#
为运算符定义优先级:# ( + - * / **
-1 0 1 1 2 2 3
从原表达式求后缀式的规则为:
1.设定运算符栈
2.假设表达式的结束符为"#",我们需要预设运算符栈底元素为"#"
3.扫描表达式,若当前字符是操作数,则直接发送给后缀表达式;
4.若当前字符为运算符且优先级大于栈顶运算符,则进栈,否则退出栈顶运算符并将其发送给后缀式。然后将当前运算符放入栈中。
5.若当前字符是结束符,则将栈中的全部运算符依次发送给后缀式。
6.若当前字符为"(",进栈。
7.若当前字符为")",则从栈顶起,依次将栈中运算符出栈发送给ie后缀式,直到碰到"("。将栈中"("出栈,不需要发送给后缀式。然后继续扫描表达式。
举例 下面以(a+b)*c为例子进行说明:
(a+b)*c的逆波兰式为ab+c*,假设计算机把ab+c*按从左到右的顺序压入栈中,并且按照遇到运算符就把栈顶两个元素出栈,执行运算,得到的结果再入栈的原则来进行处理,那么ab+c*的执行结果如下:
1)a入栈(0位置)
2)b入栈(1位置)
3)遇到运算符“+”,将a和b出栈,执行a+b的操作,得到结果d=a+b,再将d入栈(0位置)
4)c入栈(1位置)
5)遇到运算符“*”,将d和c出栈,执行d*c的操作,得到结果e,再将e入栈(0位置)
经过以上运算,计算机就可以得到(a+b)*c的运算结果e了。
逆波兰式除了可以实现上述类型的运算,它还可以派生出许多新的算法,数据结构,这就需要灵活运用了。逆波兰式只是一种序列体现形式。
结论:1,操作数之间的相对顺序不变,运算符的相对次序不同。
2,中缀表达式是没有意义的,去除了括弧。导致运算结果不一致。
3,前缀式的运算规则是:
连续出现的两个操作数和它们之前且紧靠它们的运算符构成一个最小表达式。可以用前缀式求值。
4,后缀式的运算规则刚好与前缀式相反。
运算符在式中的顺序恰为表达式的运算顺序,(先做乘法,除法,然后加法)每个运算符和在它之前出现且紧靠它的两个操作数构成一个最小表达式。
后缀式转成原表达式。
依次入栈,遇到运算符,将两个操作数出栈运算,结果再次放到栈顶。依次循环。
从原表达式求的后缀式?
出现了后面的操作数才能确定前面的运算。
注意:左边图上应该是设立运算符栈
每个运算符的运算次序要由它之前的一个运算符来定,在后缀式中,优先级高的运算符领先于优先级低的运算符
相关文章推荐
- 如何将中缀式转化成前缀式和后缀式(波兰和逆波兰)(适合考试使用的简单办法)
- 快速原型设计工具-Axure RP的介绍及简单使用(生产初期向客户展示设计产品的原型-也就是展示产品)
- 简单介绍三个C语言图形库C语言其实最擅长的是写纯数据处理的程序 . 非得用C语言写个界面程序那将会变得很困难 . 我刚开始学C语言就是从hello world 开始的 , 后来慢慢开始学从三个数中找
- 目前大家对Python都有一个共识,就是他对测试非常有用,自动化测试里Python用途也很广,但是Python到底怎么进行自动化测试呢?今天就简单的向大家介绍一下怎么使用Python进行自动化测试
- 快速原型设计工具-Axure RP的介绍及简单使用(生产初期向客户展示设计产品的原型-也就是展示产品)
- ACPI 简单介绍
- Spring中Annotation的简单介绍
- 连接池简单介绍
- iOS开发UI篇—UIWindow简单介绍
- epoll 介绍(个人看过的epoll最简单直白的介绍)
- IMA 的简单介绍
- 什么是VB进行子类化及简单介绍
- MFC与WinForm对比学习:简单介绍
- gdb 自定义脚本命令语法简单介绍
- Ghostscript 简单介绍
- Android面试之----Android系统架构图及简单的系统架构介绍
- android之PackageManager简单介绍
- TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍
- dubbo学习过程、使用经验分享及实现原理简单介绍
- react-native 从简单的事件分发来介绍redux