2016-02-24 61 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);