码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript中缀表达式转为逆波兰式(四则运算)

时间:2017-10-27 23:51:28      阅读:321      评论:0      收藏:0      [点我收藏+]

标签:while   ==   push   逆波兰   javascrip   foreach   return   result   fun   

实现过程:

1.首先创建两个空数组,result用来存放结果,temp用来存放符号;再创建一个符号集ops存放+-*/符号

2.转表达式字符为数组,开始遍历数组

3.如果遇到运算符,直接推入结果数组

4.遇到括号

  1)遇到‘(‘,推入暂存区

  2)遇到‘)‘,依次弹出暂存区栈顶运算符直到‘(‘,并且删除暂存区的‘(‘

5.遇到运算符

  1)如果暂存区

    ①为空

    ②暂存区栈顶为‘(‘

    ③当前符号的优先级高于暂存区栈顶运算符

    这几种情况直接推入栈内

  2)否则,将暂存区栈顶运算符弹出并推入结果区,再次进行步骤5

6.遍历完成则将暂存区剩余运算符依次弹出并推入结果区

function rp(str) {
    var arr = str.split(‘‘);
    var ops = ‘+-#*/‘.split(‘‘); // #用来分级,+-是同一级,*/同一级,两级之间的位置差至少为2
    var result = [], temp = [];
    arr.forEach(function(ele, ind) {
        if (ele == ‘(‘) {
            temp.push(ele); // 左括号直接推入暂存区
        } else if (ele == ‘)‘) {
            var flag = true;
            while (flag) {
                if (temp[temp.length-1] != ‘(‘) {
                    result.push(temp.pop())
                } else {
                    temp.pop();
                    flag = false;
                }
            }
        } else if (ops.indexOf(ele) != -1) {
            cb(ele, temp)
            function cb(x, o) {
                if (o.length == 0 || o[o.length-1] == ‘(‘ || 
                    ops.indexOf(x) - ops.indexOf(o[o.length-1]) > 2) { //判断分级
                    o.push(x)
                }  else {
                    result.push(o.pop());
                    return cb(x, o)
                }
            }
        } else {
            result.push(ele);
        }
    })
    while (temp.length > 0) {
        if(temp[temp.length-1] != ‘(‘) {
            result.push(temp.pop())
        } else {
            temp.pop()
        }
    }
    return result.join(‘‘);
}

实现步骤是参考一个java写的实现过程的,然而再去找没找到那篇文章了,找到再补上。。

JavaScript中缀表达式转为逆波兰式(四则运算)

标签:while   ==   push   逆波兰   javascrip   foreach   return   result   fun   

原文地址:http://www.cnblogs.com/amenging/p/7745607.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!