前端计算的正确方式

1.中缀表达式转后缀表达式计算

1.1 如何将中缀表达式转为后缀表达式

1.2代码如下

function infixToPostfix(infix) {
    let outputQueue = [];
    let operatorStack = [];
    let operators = {
        "^": {
            precedence: 4,
            rightToLeft: true
        },
        "/": {
            precedence: 3,
            rightToLeft: false
        },
        "*": {
            precedence: 3,
            rightToLeft: false
        },
        "+": {
            precedence: 2,
            rightToLeft: false
        },
        "-": {
            precedence: 2,
            rightToLeft: false
        }
    };
  
    infix = infix.replace(/\s+/g, "");

    for (let char of infix.split("")) {
        if (/\d/.test(char)) { 
            outputQueue.push(char);
        }
        else if ("^/*+-".includes(char)) {
            while (
                operatorStack.length &&
                operators[char] &&
                operators[operatorStack[operatorStack.length - 1]] &&
                operators[char].precedence <= operators[operatorStack[operatorStack.length - 1]].precedence &&
                !operators[char].rightToLeft
            ) {
                outputQueue.push(operatorStack.pop());
            }
            operatorStack.push(char);
        } 
        else if (char === "(") {
            operatorStack.push(char);
        }
        else if (char === ")") {
            while (operatorStack.length && operatorStack[operatorStack.length - 1] !== "(") {
                outputQueue.push(operatorStack.pop());
            }
            operatorStack.pop(); 
        }
        else {
            throw new Error(char);
        }
    }
    while (operatorStack.length) {
        outputQueue.push(operatorStack.pop());
    }
    return outputQueue.join(" ");
}

1.3 使用方式/运行结果

const s  = infixToPostfix("3+4*2/(1-5)")

1.4 如果利用后缀表达式计算

const operations = {
  '+': (a, b) => a + b,
  '-': (a, b) => a - b,
  '*': (a, b) => a * b,
  '/': (a, b) => parseInt(a / b) // 使用parseInt来确保结果为整数
};

function evalRPN(tokens) {
  const stack = [];

  tokens.forEach((value) => {
    if (value in operations) {
      // 操作数
      const [b, a] = [stack.pop(), stack.pop()]; // 保证顺序正确:a先弹出,b后弹出
      const operation = operations[value];
      const result = operation(a, b);
      stack.push(result);
    } else {
      // 操作符
      stack.push(parseInt(value));
    }
  });

  return stack.pop();
}

1.5 使用并得到结果

const s  = infixToPostfix("3+4*2/(1-5)")
const value = evalRPN(s.split(" "))
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值