2016-02-24 62 views
0

我正在學習JavaScript,我的一個挑戰是不使用eval()函數來製作一個計算器。到目前爲止,我做了輸入,輸入檢查等,我得到一個數組,看起來像有點像這樣numbers = ['-','1','+','2','*','3','+','(','5','/','2'comma','5',')','+','6'];因爲我還在學習,所以我不知道該從哪裏走..我如何對這個字符串進行數學計算? (),*,/?中的計算優先級如何?我應該用什麼技術來解決這個問題?我不想找到準備好去回答,我想自己寫,我需要指導如何做到這一點:)從數組值和運算符計算

鏈接到我的當前代碼在JSFiddle。到目前爲止,我正在使用該字符串來顯示按下的按鍵。

var rezult = "0"; 
var numberJoin = []; 

function skaicius(symbol) { 
    numberJoin.push(symbol); 
    secondTolast = numberJoin[numberJoin.length - 2]; 
    lastNumber = numberJoin[numberJoin.length - 1]; 
    symbolswithoutComma = numberJoin.toString(); 
    atsakymas = symbolswithoutComma.replace(/,/g, ""); 
    atsakymas = atsakymas.replace(/comma/g, ","); 
    if (numberJoin[0] === "x" || numberJoin[0] === "+") { 
    numberJoin = []; 
    } else if ((symbol === "x" || symbol === "+" || symbol === "-") && (secondTolast === "x" || secondTolast === "+" || secondTolast === "-")) { 
    numberJoin.splice(numberJoin.length - 2, numberJoin.length - 1); 
    numberJoin.push(symbol); 
    } else if (symbol === "delete") { 
    numberJoin = []; 
    rezult = "0"; 
    document.getElementById("rezult").innerHTML = rezult; 
    } else if (symbol === "=") { 
    } else { 
    document.getElementById("rezult").innerHTML = atsakymas; 
    } 
} 

編輯:EVAL()之類的東西的新功能( '返回-1 + 2 * 3 +(5/2,5)6')()都有點作弊的和因爲我學習,我想嘗試解決這個問題,而不會作弊:)

+0

你需要共享代碼的問題... –

+0

工作小提琴:https://jsfiddle.net/arunpjohny/tmtLvfg8/29/ - 腳本在默認情況下加入到一個'onload'處理程序 –

+0

謝謝你的意見並修復我的jsfiddle :) –

回答

0

有很多衆所周知的算法有助於評估表達式。

使用堆棧數據結構可以將運算符和操作數推入數組中。 將它們按順序排列以產生給定表達式的值。

得到表達式的中綴,前綴和後綴表示法的一些想法。

開始與二進制運算+,-,%,*,然後提高納入括號()

0

也許你正在尋找這一點,函數的集合,並在在RPN風格的命令基於堆棧的迭代。

在輸出中您可以看到實際的命令和堆棧。

var $ = { 
 
     '===': function (b) { return function (a) { return a === b; }; }, 
 
     '+': function (b) { return function (a) { return a + b; }; }, 
 
     '-': function (b) { return function (a) { return a - b; }; }, 
 
     '1/x': function (a) { return 1/a; }, 
 
    }, 
 
    commands = [3, 2, '+', 9, 4, '-', '==='], 
 
    result = commands.reduce(function (stack, command) { 
 
     var temp; 
 
     if ($[command]) { 
 
      temp = $[command]; 
 
      while (typeof temp === 'function') { 
 
       temp = temp(stack.pop()); 
 
      } 
 
      stack.push(temp); 
 
     } else { 
 
      stack.push(command); 
 
     } 
 
     document.write('<pre>' + command + ': ' + JSON.stringify(stack, 0, 4) + '</pre>'); 
 
     return stack; 
 
    }, [])[0]; 
 

 
document.write(result);