用逆波兰表示法表示给定的数学表达式 solveRPN – JavaScript 实用代码片段

逆波兰表示法表示给定的数学表达式。
如果有无法识别的符号或表达式错误,则会引发适当的错误。有效的运算符是:+,-,*,/,^,** (^** 是幂指符号。是相同的)。这段代码不支持任何一元运算符。

使用一个字典,OPERATORS 来指定每个操作符的匹配数学运算。
使用带有正则表达式的 String.replace() 来代替 ^,用 **String.split() 来标记字符串,并且使用 Array.filter() 去除空的标记。
使用 Array.forEach() 来解析每个 symbol ,将其求值为一个数值或运算符,并解决数学表达式。
数字值被转换为浮点数并被推送到 stack ,而操作符则使用 OPERATORS 字典和来自 stack 的弹出元素来执行操作。

const solveRPN = rpn => {
  const OPERATORS = {
    '*': (a, b) => a * b,
    '+': (a, b) => a + b,
    '-': (a, b) => a - b,
    '/': (a, b) => a / b,
    '**': (a, b) => a ** b
  };
  const [stack, solve] = [
    [],
    rpn
      .replace(/\^/g, '**')
      .split(/\s+/g)
      .filter(el => !/\s+/.test(el) && el !== '')
  ];
  solve.forEach(symbol => {
    if (!isNaN(parseFloat(symbol)) && isFinite(symbol)) {
      stack.push(symbol);
    } else if (Object.keys(OPERATORS).includes(symbol)) {
      const [a, b] = [stack.pop(), stack.pop()];
      stack.push(OPERATORS[symbol](parseFloat(b), parseFloat(a)));
    } else {
      throw `${symbol} is not a recognized symbol`;
    }
  });
  if (stack.length === 1) return stack.pop();
  else throw `${rpn} is not a proper RPN. Please check it and try again`;
};
solveRPN('15 7 1 1 + - / 3 * 2 1 1 + + -'); // 5
solveRPN('3 5 6 + *'); //33
solveRPN('2 4 / 5 6 - *'); //-0.5
solveRPN('2 3 ^'); //8
solveRPN('2 3 ^'); //8

更多代码 JavaScript 实用代码片段 请查看 https://www.html.cn/30-seconds-of-code/

赞(0) 打赏
未经允许不得转载:WEB前端开发 » 用逆波兰表示法表示给定的数学表达式 solveRPN – JavaScript 实用代码片段

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

前端开发相关广告投放 更专业 更精准

联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏