Maison  >  Article  >  interface Web  >  Évaluation d'expressions mathématiques en tenant compte de la priorité des opérateurs en JavaScript

Évaluation d'expressions mathématiques en tenant compte de la priorité des opérateurs en JavaScript

WBOY
WBOYavant
2023-08-24 15:53:091095parcourir

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

Question

Nous devons écrire une fonction JavaScript qui reçoit une expression mathématique sous forme de chaîne et renvoie son résultat sous forme de nombre.

Nous devons prendre en charge les opérateurs mathématiques suivants -

  • Division / (comme division en virgule flottante)

  • Addition + p>

  • Soustraction -

  • Multiplication*

Les opérateurs sont toujours basé sur left À droite, * et / doivent être évalués avant + et -.

Exemple

Voici le code -

Démonstration en temps réel

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 !== &#39;&#39;) {
         outputQueue.push(new Number(str));
         str = &#39;&#39;;
      }
      if (ch === &#39;-&#39;) {
         if (ind == 0) {
            ch = &#39;negate&#39;;
         } else {
            let nextCh = exp[ind+1];
            let prevCh = exp[ind-1];
            if ((digits.includes(nextCh) || nextCh === &#39;(&#39; || nextCh === &#39;-&#39;) &&
               (operators.includes(prevCh) || exp[ind-1] === &#39;(&#39;)) {
                  ch = &#39;negate&#39;;
            }
         }
      }
      if (operations.length > 0) {
         let topOper = operations[operations.length - 1];
         while (operations.length > 0 && legend[topOper] &&
         ((legend[ch].assoc === &#39;left&#39; && legend[ch].pred <= legend[topOper].pred) ||
         (legend[ch].assoc === &#39;right&#39; && 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 === &#39;(&#39;) {
      operations.push(ch);
   } else if (ch === &#39;)&#39;) {
      if (str !== &#39;&#39;) {
         outputQueue.push(new Number(str));
         str = &#39;&#39;;
      }
      while (operations.length > 0 && operations[operations.length - 1] !== &#39;(&#39;) {
         outputQueue.push(operations.pop());
      }
      if (operations.length > 0) { operations.pop(); }
   }
   ind++;
}
if (str !== &#39;&#39;) { 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 === &#39;negate&#39;) {
            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));

Sortie

2

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer