Solves the given mathematical expression in reverse polish notation. Throws appropriate errors if there are unrecognized symbols or the expression is wrong.
Use a dictionary, OPERATORS to specify each operator's matching mathematical operation. Use String.replace() with a regular expression to replace ^ with **, String.split() to tokenize the string and Array.filter() to remove empty tokens. Use Array.forEach() to parse each symbol, evaluate it as a numeric value or operator and solve the mathematical expression. Numeric values are converted to floating point numbers and pushed to a stack, while operators are evaluated using the OPERATORS dictionary and pop elements from the stack to apply operations.
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`;
+};
+
\ No newline at end of file
diff --git a/snippets/solveRPN.md b/snippets/solveRPN.md
index 059c0ac36..099be512a 100644
--- a/snippets/solveRPN.md
+++ b/snippets/solveRPN.md
@@ -8,21 +8,35 @@ Use `String.replace()` with a regular expression to replace `^` with `**`, `Stri
Use `Array.forEach()` to parse each `symbol`, evaluate it as a numeric value or operator and solve the mathematical expression.
Numeric values are converted to floating point numbers and pushed to a `stack`, while operators are evaluated using the `OPERATORS` dictionary and pop elements from the `stack` to apply operations.
-``` js
+```js
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 !== '')];
+ 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`
-}
+ 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`;
+};
```
```js
diff --git a/tag_database b/tag_database
index c4f3cd421..39940d0f1 100644
--- a/tag_database
+++ b/tag_database
@@ -137,6 +137,7 @@ shuffle:array
similarity:array
size:object
sleep:function
+solveRPN:uncategorized
sortCharactersInString:string
sortedIndex:array
speechSynthesis:browser