评估JavaScript中的反向波兰表示法算法

评估JavaScript中的反向波兰表示法算法,javascript,algorithm,Javascript,Algorithm,我试图用JavaScript实现这个算法 问题: 以反向抛光方式计算算术表达式的值 符号 有效运算符为+、-、*、/。每个操作数可以是整数或整数 另一个表达 注: 两个整数之间的除法应该向零截断。给定的 RPN表达式始终有效。这意味着表达式将始终 对结果求值,将不会有任何除零操作 例如: Input: ["10", "6", "9", "3", "+", "-11", &quo

我试图用JavaScript实现这个算法

问题:

以反向抛光方式计算算术表达式的值 符号

有效运算符为+、-、*、/。每个操作数可以是整数或整数 另一个表达

注:

两个整数之间的除法应该向零截断。给定的 RPN表达式始终有效。这意味着表达式将始终 对结果求值,将不会有任何除零操作

例如:

Input: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
Output: 22
Explanation: 
  ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22
我的解决方案:

var evalRPN = function(tokens) {
    let set = new Set();
    set.add('+');
    set.add('-');
    set.add('/');
    set.add('*');
    
    let i = 0;
    while(tokens.length > 1) {
        if(set.has(tokens[i+2])) {
            const result = calculate(parseInt(tokens[i]), parseInt(tokens[i+1]), tokens[i+2]);
            tokens.splice(i, 3, result);
            i = 0;
        } else
            i++;
    }
    
    return tokens[0];
};
    
const calculate = (left, right, operator) => {
    let res;
    switch(operator) {
        case '+':
            res = left + right;
            break;
        case '-':
            res = left - right;
            break;
        case '*':
            res = left * right;
            break;
        case '/':
            res = left / right;
            break;
    }
    
    return res;
}
对于示例和大多数测试用例,它都可以正常工作。但是,对于以下测试用例,它失败:

Input: ["-8","23","8","-","9","23","-","-","*","33","-8","/","+","38","-14","-","-","-7","32","-19","-","11","+","+","+","14","22","-","-","27","-9","-","+","31","+","-12","-11","-","-","14","+","30","+","37","30","-","+","-9","+","7","-","37","+","-5","13","/","-","19","-2","-19","12","+","-","23","+","-","-19","-","+","6","+","-17","+","17","+","5","36","+","-10","+","+","23","-8","-","-","18","-","31","-16","-","+","34","+","-6","+","24","-","22","-","-8","-","28","+","-12","+","39","28","-7","+","+","-14","5","+","5","+","10","+","+","+","-18","*","10","+","-5","11","-","6","+","-","-12","31","+","+","30","29","-","-","39","+","13","-8","-5","+","-","26","19","-","*","-","10","-","-20","5","+","+","0","-","28","-","19","/","28","+","-18","-","28","20","+","-5","-19","+","+","-","-12","-","3","-","6","-15","+","4","-","-","38","+","-9","-","38","-","12","-20","-","10","5","-15","-","-","-","+","-11","+","5","+","2","-","28","+","-9","-11","-","+","37","-","-17","31","-","2","+","+","-16","-12","-","-","12","+","34","-","15","+","8","+","17","-","2","-","33","+","-5","+","14","+","29","-","33","23","+","26","30","-","+","+","39","+","9","24","-","-","20","15","+","-","24","+","37","-","30","-1","-","+","34","+","-13","-","23","15","-","-","-5","-8","8","30","35","-9","22","+","-","-","36","-1","+","5","-","-","+","25","-","+","27","-","16","+","+","+","39","-","15","-","-3","+","5","-6","-","+","-6","-15","-7","-","+","/","13","-","18","+","4","+","29","+","-17","0","-6","-20","-17","+","12","-","+","-","+","+","-10","22","+","+","-11","-","-2","38","-","-","-6","+","0","-","-10","+","-4","-10","+","-","0","-","31","30","-","37","5","+","+","+","-15","+","38","4","-","-16","-17","+","+","+","38","-","27","-19","/","12","+","/"]

我的代码返回12,但答案应该是11。

您有这个要求

两个整数之间的除法应该向零截断

因此,您需要:

case '/':
    res = Math.trunc(left / right);

你有要求吗

两个整数之间的除法应该向零截断

因此,您需要:

case '/':
    res = Math.trunc(left / right);