/** * Evaluate a numeric operations string in postfix notation using a stack. * Supports basic arithmetic operations: +, -, *, / * @see https://www.geeksforgeeks.org/evaluation-of-postfix-expression/ * @param {string} expression - Numeric operations expression to evaluate. Must be a valid postfix expression. * @returns {number|null} - Result of the expression evaluation, or null if the expression is invalid. */ function evaluatePostfixExpression(expression) { const stack = [] // Helper function to perform an operation and push the result to the stack. Returns success. function performOperation(operator) { const rightOp = stack.pop() // Right operand is the top of the stack const leftOp = stack.pop() // Left operand is the next item on the stack if (leftOp === undefined || rightOp === undefined) { return false // Invalid expression } switch (operator) { case '+': stack.push(leftOp + rightOp) break case '-': stack.push(leftOp - rightOp) break case '*': stack.push(leftOp * rightOp) break case '/': if (rightOp === 0) { return false } stack.push(leftOp / rightOp) break default: return false // Unknown operator } return true } const tokens = expression.split(/\s+/) for (const token of tokens) { if (!isNaN(parseFloat(token))) { // If the token is a number, push it to the stack stack.push(parseFloat(token)) } else { // If the token is an operator, perform the operation if (!performOperation(token)) { return null // Invalid expression } } } return stack.length === 1 ? stack[0] : null } export { evaluatePostfixExpression }