Skip to content

Instantly share code, notes, and snippets.

@BRonen
Created July 30, 2023 04:29
Show Gist options
  • Save BRonen/0fe00e832cd97c1fca5e63000184fcd8 to your computer and use it in GitHub Desktop.
Save BRonen/0fe00e832cd97c1fca5e63000184fcd8 to your computer and use it in GitHub Desktop.
Evaluates an expression in Reverse Polish Notation
/**
* Evaluates an expression in Reverse Polish Notation.
*
* @param {string} expression - The input expression.
* @returns {number} The result of the RPN expression.
*/
// This script parses the expression into a tree and then evaluates, should be something like O(n) because iterates once on the parsing and once in the evaluating
type Operator = {op: string, left: Operator | number, right: Operator | number};
const operators: Record<string, (x: number, y: number) => number> = {
'+': (x: number, y: number) => y + x,
'-': (x: number, y: number) => y - x,
'*': (x: number, y: number) => y * x,
'/': (x: number, y: number) => y / x,
};
const evaluate = (tree: Operator | number): number => {
if(typeof tree === 'number') return tree;
return operators[tree.op](evaluate(tree.left), evaluate(tree.right))
};
const parse = (tokens: string[]): Operator | number => {
const token = tokens.pop();
if(!token) return 0;
if(!Object.keys(operators).includes(token)) return Number(token);
return {op: token, left: parse(tokens), right: parse(tokens)};
}
const calculate = (expression: string): number => {
const stack = expression.split(' ')
return evaluate(parse(stack));
};
export { calculate };
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment