最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 在 JavaScript 中考虑运算符优先级评估数学表达式

    在 javascript 中考虑运算符优先级评估数学表达式

    问题

    我们需要编写一个 JavaScript 函数,它将数学表达式作为字符串接收,并将其结果作为数字返回。

    我们需要支持以下数学运算符 –

    • 除法 /(作为浮点除法)

    • 加法 + p>

    • 减法 –

    • 乘法 *

    运算符始终根据从左到右,* 和 / 必须在 + 和 – 之前计算。

    示例

    以下是代码 –

     实时演示

    const exp = '6 - 4';
    const findResult = (exp = '') => {
       const digits = '0123456789.';
       const operators = ['+', '-', '*', '/', 'negate'];
       const legend = {
          '+': { pred: 2, func: (a, b) => { return a + b; }, assoc: "left" },
          '-'&: { pred: 2, func: (a, b) => { return a - b; }, assoc: "left" },
          '*': { pred: 3, func: (a, b) => { return a * b; }, assoc: "left" },
          '/': { pred: 3, func: (a, b) => {
          if (b != 0) { return a / b; } else { return 0; }
       }
       }, assoc: "left",
       'negate': { pred: 4, func: (a) => { return -1 * a; }, assoc: "right" }
    };
    exp = exp.replace(/s/g, '');
    let operations = [];
    let outputQueue = [];
    let ind = 0;
    let str = '';
    while (ind < exp.length) {
       let ch = exp[ind];
       if (operators.includes(ch)) {
          if (str !== '') {
             outputQueue.push(new Number(str));
             str = '';
          }
          if (ch === '-') {
             if (ind == 0) {
                ch = 'negate';
             } else {
                let nextCh = exp[ind+1];
                let prevCh = exp[ind-1];
                if ((digits.includes(nextCh) || nextCh === '(' || nextCh === '-') &&
                   (operators.includes(prevCh) || exp[ind-1] === '(')) {
                      ch = 'negate';
                }
             }
          }
          if (operations.length > 0) {
             let topOper = operations[operations.length - 1];
             while (operations.length > 0 && legend[topOper] &&
             ((legend[ch].assoc === 'left' && legend[ch].pred <= legend[topOper].pred) ||
             (legend[ch].assoc === 'right' && legend[ch].pred < legend[topOper].pred))) {
                outputQueue.push(operations.pop());
                topOper = operations[operations.length - 1];
             }
          }
          operations.push(ch);
       } else if (digits.includes(ch)) {
          str += ch
       } else if (ch === '(') {
          operations.push(ch);
       } else if (ch === ')') {
          if (str !== '') {
             outputQueue.push(new Number(str));
             str = '';
          }
          while (operations.length > 0 && operations[operations.length - 1] !== '(') {
             outputQueue.push(operations.pop());
          }
          if (operations.length > 0) { operations.pop(); }
       }
       ind++;
    }
    if (str !== '') { outputQueue.push(new Number(str)); }
       outputQueue = outputQueue.concat(operations.reverse())
       let res = [];
       while (outputQueue.length > 0) {
          let ch = outputQueue.shift();
          if (operators.includes(ch)) {
             let num1, num2, subResult;
             if (ch === 'negate') {
                res.push(legend[ch].func(res.pop()));
             } else {
                let [num2, num1] = [res.pop(), res.pop()];
                res.push(legend[ch].func(num1, num2));
             }
          } else {
             res.push(ch);
          }
       }
       return res.pop().valueOf();
    };
    console.log(findResult(exp));

    输出

    2
    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 在 JavaScript 中考虑运算符优先级评估数学表达式
    • 10会员总数(位)
    • 14529资源总数(个)
    • 1172本周发布(个)
    • 159 今日发布(个)
    • 104稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情