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寫的實現過程的,然而再去找沒找到那篇文章了,找到再補上。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM