概述
逆波兰表达式
- 前言
- 一、概念
- 二、特点
- 三、举例
- 四、意义
前言
今天在学习数据结构-栈的时候接触到一个有意思的表达式,逆波兰表达式。作为一个文科生,一听到这数学专业名词就有些瑟瑟发抖,本着攻克晦涩知识点的两个要领(一、耐心;二、由难分解成简)硬着头皮看了几次介绍和相关案例,算是有了一些自己的理解,感觉还挺有趣儿,分享给大家。
一、概念
逆波兰表达式是波兰逻辑学家 J.Lukasiewicz 于1929年提出的,这种表达式是将运算符都置于数值的后面,所以也叫后缀表达式。
二、特点
- 运算符号永远在数值的后面
如普通表达式为 2+3,因为运算符在数值中间,所以这种表达式也叫中缀表达式,而逆波兰表达式写法是 23+(将运算符写在数值后面)。 - 运算符的置后顺序是由运算顺序决定的
如(1+2)*(3+4),逆波兰表达式为 12+34+ *,而不是 1234++ *,因为运算顺序是先计算(1+2),然后计算(3+4),最后再将两个结果相乘。所以顺序就是 12+,然后 34+,最后一个 *。而不是无脑的将所有数值置前,符号置后。
三、举例
普通表达式 | 逆波兰表达式 |
---|---|
2*8+16/2 | 2,8,*,16,2,/,+ |
28+(16-2) | 28,16,2,-,+ |
8=10-2 | 8,10,2,-,= |
注意:逆波兰表达式一定要注意运算符号的置后顺序,否则是计算不出来结果的。
四、意义
逆波兰表达式的一个重要作用就是,可以将复杂的运算转换为依靠简单的操作就可以计算出结果的简单表达式。
上面这句话怎么理解昵?简单表达式是什么,简单的操作又是什么?
-
简单的表达式
还是拿上面的例子来说,(1+2)*(3+4),这是一个既有加法,又有乘法的复杂运算表达式,如果用数组接收,然后转换为逆波兰表达式为 [1,2,’+’,3,4,’+’,’ * '],是不是看上去就是一个简单的表达式。 -
简单的操作
简单的操作指的就是有了表达式之后,就要开始运算。这里就跟前面提到的数据结构之栈有关联。通过利用栈的特点,在逆波兰表达式中,遇到 ‘+’,‘-’,‘*’,‘/’ 运算符号就把栈中的前两个数值拿出来进行计算,否则将元素(非运算符号)压入栈中,如此反复,最后在栈中剩下的元素就是计算结果。
//1.创建一个栈结构
function Stack() {
var arr = [];
this.push = function (item) {
arr.push(item);
};
this.pop = function (item) {
return arr.pop(item);
};
this.size = function () {
return arr.length;
};
return arr;
};
//2.计算逆波兰表达式
function calc_exp(exp) {
var stack = new Stack();
for(var i = 0;i< exp.length;i++){
var item = exp[i];
if(["+","-","*","/"].indexOf(item)>= 0){
var str1 = stack.pop();
var str2 = stack.pop();
var str3= str2 + item + str1;
stack.push(parseInt(eval(str3)))
}else {
stack.push(item);
}
}
console.log(stack[0])
};
//3.参数
var arr1= [2,8,'*',16,2,'/','+'];//普通表达式为 2*8+16/2
var arr2=[28,16,2,'-','+'];//普通表达式为 28+(16-2)
//4.验证
calc_exp(arr1);//24
calc_exp(arr2);//42
最后
以上就是寂寞汉堡为你收集整理的逆波兰表达式前言一、概念二、特点三、举例四、意义的全部内容,希望文章能够帮你解决逆波兰表达式前言一、概念二、特点三、举例四、意义所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复