源代码

function precedence(operator) {
    if (operator === '+' || operator === '-') return 1;
    if (operator === '*' || operator === '/') return 2;
    return 0;
}

function applyOperator(values, operators) {
    const right = values.pop();
    const left = values.pop();
    const op = operators.pop();
    switch (op) {
        case '+':
            return left + right;
        case '-':
            return left - right;
        case '*':
            return left * right;
        case '/':
            return left / right;
    }
}

function evaluateExpression(expression) {
    const values = [];
    const operators = [];
    const tokens = expression.split(' ');
    for (let i = 0; i < tokens.length; i++) {
        if (tokens[i] ==='') continue;
        else if (!isNaN(Number(tokens[i]))) {
            values.push(Number(tokens[i]));
        } else if (tokens[i] === '(') {
            operators.push(tokens[i]);
        } else if (tokens[i] === ')') {
            while (operators.length > 0 && operators[operators.length - 1]!== '(') {
                const result = applyOperator(values, operators);
                values.push(result);
            }
            operators.pop(); // 弹出 '('
        } else {
            while (operators.length > 0 && precedence(operators[operators.length - 1]) >= precedence(tokens[i])) {
                const result = applyOperator(values, operators);
                values.push(result);
            }
            operators.push(tokens[i]);
        }
    }
    while (operators.length > 0) {
        const result = applyOperator(values, operators);
        values.push(result);
    }
    return values[0];
}

function main() {
    const readline = require('readline');
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });
    rl.question('请输入计提公式(只包含 +、-、*、/ 的非负整数运算表达式,整数和运算符用空格分隔):', (input) => {
        if (input === '0') {
            rl.close();
        } else {
            const result = evaluateExpression(input);
            console.log(result.toFixed(2));
        }
    });
}

main();

运行结果示例

请输入计提公式(只包含 +、-、*、/ 的非负整数运算表达式,整数和运算符用空格分隔):3 + 4 * 2 - 1 10.00