JavaScript中綴表達式轉為逆波蘭式(四則運算)
阿新 • • 發佈:2017-10-28
。。 刪除 並且 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中綴表達式轉為逆波蘭式(四則運算)