逆波兰表达式

前言

今天在学习数据结构-栈的时候接触到一个有意思的表达式,逆波兰表达式。作为一个文科生,一听到这数学专业名词就有些瑟瑟发抖,本着攻克晦涩知识点的两个要领(一、耐心;二、由难分解成简)硬着头皮看了几次介绍和相关案例,算是有了一些自己的理解,感觉还挺有趣儿,分享给大家。

一、概念

逆波兰表达式是波兰逻辑学家 J.Lukasiewicz 于1929年提出的,这种表达式是将运算符都置于数值的后面,所以也叫后缀表达式。

二、特点

  • 运算符号永远在数值的后面
    如普通表达式为 2+3,因为运算符在数值中间,所以这种表达式也叫中缀表达式,而逆波兰表达式写法是 23+(将运算符写在数值后面)。
  • 运算符的置后顺序是由运算顺序决定的
    如(1+2)*(3+4),逆波兰表达式为 12+34+ *,而不是 1234++ *,因为运算顺序是先计算(1+2),然后计算(3+4),最后再将两个结果相乘。所以顺序就是 12+,然后 34+,最后一个 *。而不是无脑的将所有数值置前,符号置后。

三、举例

普通表达式逆波兰表达式
2*8+16/22,8,*,16,2,/,+
28+(16-2)28,16,2,-,+
8=10-28,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
  • 30
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值