用逆波兰表示法表示给定的数学表达式。
如果有无法识别的符号或表达式错误,则会引发适当的错误。有效的运算符是:+
,-
,*
,/
,^
,**
(^
和**
是幂指符号。是相同的)。这段代码不支持任何一元运算符。
使用一个字典,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/
最新评论
写的挺好的
有没有兴趣翻译 impatient js? https://exploringjs.com/impatient-js/index.html
Flexbox playground is so great!
感谢总结。
awesome!
这个好像很早就看到类似的文章了
比其他的教程好太多了
柯理化讲的好模糊…没懂