我正在学习JavaScript,我的一个挑战是在不使用eval()函数的情况下制作计算器。到目前为止,我进行了输入,输入检查等等,我得到的数组看起来有点像{{1因为我还在学习,我不知道从哪里开始......我如何对这个字符串进行数学运算?我如何优先考虑(),*,/中的计算?我应该用什么技术来解决这个问题?我不是在寻找准备回答,我想自己写,我需要有关如何做到这一点的指导:)
链接到JSFiddle中的当前代码。到目前为止,我正在使用字符串来显示按下的键。
numbers = ['-','1','+','2','*','3','+','(','5','/','2'comma','5',')','+','6'];
编辑:eval()和新功能之类的东西('返回-1 + 2 * 3 +(5 / 2,5)+6')()有点作弊,因为我正在学习,我'我想尝试解决这个问题而不作弊:)
答案 0 :(得分:0)
有许多众所周知的算法可以帮助评估表达式。
使用堆栈数据结构,您可以将运算符和操作数推送到数组中。 在命令表单数组中弹出它们以生成给定表达式的值。
了解表达的中缀,前缀和后缀表示法。
从二进制操作+,-,%,*
开始,然后增强以合并括号()
答案 1 :(得分: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);