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

实现过程:

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写的实现过程的,然而再去找没找到那篇文章了,找到再补上。。

posted @ 2017-10-27 23:17  阿萌ameng  阅读(1646)  评论(0编辑  收藏  举报