逆波兰表达式简单介绍
逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法。按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。
逆波兰表达式
逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子:
正常的表达式 逆波兰表达式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
a=1+3 ---> a=1,3 +
http=(smtp+http+telnet)/1024 写成什么呢?
http=smtp,http,telnet,+,+,1024,/
逆波兰表达式的用途
逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)*(c+d)转换为ab+cd+*
逆波兰表达式的优势
它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。其运算方式如下:
如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。
一般算法
将一个普通的中序表达式转换为逆波兰表达式的一般算法是:
(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。
(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。
(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。
(4)如果不是数字,该字符则是运算符,此时需比较优先关系。
做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将栈顶的运算符从栈中弹出,直到栈顶运算符的优先级低于当前运算符,将该字符入栈。
(5)重复上述操作(3)-(4)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。
算法流程
下面是程序化算法流程:
1、建立运算符栈stackOperator用于运算符的存储,压入'\0'。
2、预处理表达式,正、负号前加0(如果一个加号(减号)出现在最前面或左括号后面,则该加号(减号)为正负号) 。
3、顺序扫描表达式,如果当前字符是数字(优先级为0的符号),则直接输出该数字;如果当前字符为运算符或括号(优先级不为0的符号),则判断第4点 。
4、若当前运算符为'(',直接入栈;
若为')',出栈并顺序输出运算符直到遇到第一个'(',遇到的第一个'('出栈但不输出;
若为其它,比较stackOperator栈顶元素与当前元素的优先级:
如果 栈顶元素运算符优先级 >= 当前元素的优先级,出栈并顺序输出运算符直到 栈顶元素优先级 < 当前元素优先级,然后当前元素入栈;
如果 栈顶元素 < 当前元素,直接入栈。
5、重复第3点直到表达式扫描完毕。
6、顺序出栈并输出运算符直到栈顶元素为'\0'。
int Precedence(char sign)
{
switch(sign)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '^':
case '%':
return 3;
case '(':
case '@':
default:
return 0;
}
}
/****************中缀表达式转换成后缀表达式 ********************/
void Change(char* s1,char* s2)
{
seqstack T;
int i=0,j=0;
char ch;
SetNull(&T);
Push(&T,'@');
ch=s1[i];
while(ch!='\0')
{
if(ch==' ')
ch=s1[++i];
else if(ch=='(')
{
Push(&T,ch);
ch=s1[++i];
}
else if(ch==')')
{
while(GetTop(&T)!='(')
s2[j++]=Pop(&T);
Pop(&T);
ch=s1[++i];
}
else if(ch=='+' || ch=='-' ||ch=='*' ||ch=='/' ||ch=='^' ||ch=='%')
{
char w=GetTop(&T);
while(Precedence(w)>=Precedence(ch))
{
s2[j++]=w;
Pop(&T);
w=GetTop(&T);
}
Push(&T,ch);
ch=s1[++i];
}
else
{
while((ch>='0' && ch<='9')||ch=='.')
{
s2[j++]=ch;
ch=s1[++i];
}
s2[j++]=' ';
}
}
ch=Pop(&T);
while(ch!='@')
{
s2[j++]=ch;
ch=Pop(&T);
}
s2[j++]='\0';
}
优先级分类
优先级分为栈内优先级isp(In stack priority)和栈外优先级icp(In coming priority)。除了括号以外,其他运算符进栈后优先级都升1,这样可以体现在中缀表达式中相同优先级的操作符自左向右计算的要求,让位于栈顶的操作符先退栈并输出。
各运算符及符号优先级:
操作符 | # | ^ | *,/,% | +,- | ( | ) |
isp | 0 | 7 | 5 | 3 | 1 | 8 |
icp | 0 | 6 | 4 | 2 | 8 | 1 |
转载于:https://www.cnblogs.com/yqskj/articles/2050878.html
逆波兰表达式简单介绍相关推荐
- 简单计算器 逆波兰表达式
问题 C: 悠派计算器 时间限制: 1 Sec 内存限制: 128 MB 提交: 7 解决: 2 [提交][状态][讨论版][命题人:qianyouyou] 题目描述 yoyo的小老弟小渣渣灰特别 ...
- 栈应用-逆波兰表达式(CPP实现简单易懂图解)
栈应用-逆波兰表达式(后缀表达式) 逆波兰表达式定义: 在由运算符(operator)和操作数(operand)组成的表达式中不使用括号(parenthesis-free)即可表示带优先级的运算关系 ...
- 【栈】【150. 逆波兰表达式求值】【中等】(需回顾)
根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...
- 数据结构-栈应用之逆波兰表达式(后缀表达式)
逆波兰表达式含义我就不做赘述了,摘自百科上的一段话: 逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示.波兰逻辑学家J.Lukas ...
- 前缀表达式后缀表达式_你知道波兰表达式和逆波兰表达式吗
什么是波兰表达式 我们日常的运算表达式通常是如下形式,这种成为中缀表达式,也就是运算符在运算数的中间.这种表达式人类很容易识别,并根据其进行计算,但计算机识别这种表达式非常困难. a + b * (c ...
- 逆波兰表达式-----------红黑树--------mysql(DDL)----生产者消费者模式
逆波兰表达式 二元运算符的表达式定义为:(操作数) + (运算符) + (操作数) ,其中操作数也可以为表达式. 在计算机中,根据运算符所在的不同位置来命名,表达式可以有如下三种不同的表示方法: 记表 ...
- My Twenty-Fourth - Page - 逆波兰表达式求值 - By Nicolas
这篇page是针对leetcode上的150.逆波兰表达式这道题所写的,小尼先简单说明一下这道题的意思,这道题先是介绍了有效的运算符包括"+","-",&quo ...
- 前缀表达式(波兰表达式)介绍及其代码实现(Java)
1 前缀表达式介绍 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前 举例说明: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 1.1 前缀表达式的计算机求值过程 从右至 ...
- 逆波兰计算器android源码简书,计算器的核心算法-JavaScript实现(逆波兰表达式)...
最终计算器的掩饰效果,欢迎大家来找BUG. http://codepen.io/lvanboy/full/LxKVxJ/ 功能: 1.按照运算符的优先级运算 2.利用上次的结果继续运算 3.多个数字混 ...
最新文章
- 阿里云面试官:如果是MySQL引起的CPU消耗过大,你会如何优化?
- c语言char数字转int补位,关于char强制转换成int到底是用0还是用1补位的猜想与检验...
- 手把手教你将pyqt程序打包成exe(1)
- DataKeyNames
- Redis学习笔记~是时候为Redis实现一个仓储了,RedisRepository来了
- ASP“.NET研究”.NET中的认证与授权
- 客户成功已死,客户服务还活着
- 微信小程序实例源码大全下载
- 日记/malloc函数与头文件
- (三十七)java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案
- Unity_线性空间
- Oracle 删除归档
- [IJKPLAYER]编译与DEMO运行
- 上海大学保研夏令营计算机,2019年上海大学计算机学院保研情况
- 关于waitKey()函数的用法
- Matlab函数fir1(n,Wn)中的归一化频率的含义
- 7-3 狡猾的财主,个人思路及解答
- 使用convert命令将pdf转成图片时遇到的一个问题
- 教你如何下载在线视频
- Ant Design Pro 菜单icon图标修改或新增
热门文章
- Linux 利用yum源安装php7.0+nginx
- python中比较运算符用于比较两个数_python中的运算和运算符
- 提取图片纹理_Fundamentals Of Computer Graphics 第十一章 纹理映射(中)
- 计算机网络专业的基础知识,计算机网络专业基础知识.doc
- tpl.func.php,微赞微擎常用媒体上传函数 单图|多图|音频|视频
- php 快递查询,PHP查询快递信息
- postman调用webservice接口_【分享】关于接口对前后端和测试的意义
- python中的loop啥意思_python怎么进行loop
- 机器学习(一)线性回归
- SparkSQL 将统计结果保存到Mysql