javascript - 在 JavaScript 中评估逆波兰表示法算法

标签 javascript algorithm

我正在尝试实现 Reverse Polish notation JavaScript 中的算法。

问题:

Evaluate the value of an arithmetic expression in Reverse Polish Notation.

Valid operators are +, -, *, /. Each operand may be an integer or another expression.

Note:

Division between two integers should truncate toward zero. The given RPN expression is always valid. That means the expression would always evaluate to a result and there won't be any divide by zero operation.

示例:

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。

最佳答案

你有这个要求

Division between two integers should truncate toward zero.

因此,您需要:

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

关于javascript - 在 JavaScript 中评估逆波兰表示法算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65009481/

相关文章:

javascript - 拖放后如何将图像上传到服务器

javascript - 我应该根据调用还是根据 reducer 管理的状态来组织我的 react redux reducer 组合?

sql - 为每个用户选择随机的非重复行

algorithm - Racket 上的动态规划

algorithm - 还款金额不固定时计算年利率

javascript - 数据表createdRow函数未将id设置为行元素

javascript - 正则表达式在 JS 文件中查找第一条评论

javascript - 使用 Javascript 获取基本 JSON 值时遇到问题

algorithm - 加权图算法

c++ - 3D数据的高斯模糊