1. 程式人生 > >JavaScript中綴表達式轉為逆波蘭式(四則運算)

JavaScript中綴表達式轉為逆波蘭式(四則運算)

。。 刪除 並且 asc 情況 暫存 運算符 pan true

實現過程:

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中綴表達式轉為逆波蘭式(四則運算)