从数组值和运算符计算

时间:2016-02-24 07:56:26

标签: javascript arrays

我正在学习JavaScript,我的一个挑战是在不使用eval()函数的情况下制作计算器。到目前为止,我进行了输入,输入检查等等,我得到的数组看起来有点像{{1因为我还在学习,我不知道从哪里开始......我如何对这个字符串进行数学运算?我如何优先考虑(),*,/中的计算?我应该用什么技术来解决这个问题?我不是在寻找准备回答,我想自己写,我需要有关如何做到这一点的指导:)

链接到JSFiddle中的当前代码。到目前为止,我正在使用字符串来显示按下的键。

numbers = ['-','1','+','2','*','3','+','(','5','/','2'comma','5',')','+','6'];
编辑:eval()和新功能之类的东西('返回-1 + 2 * 3 +(5 / 2,5)+6')()有点作弊,因为我正在学习,我'我想尝试解决这个问题而不作弊:)

2 个答案:

答案 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);