Maison > interface Web > js tutoriel > le corps du texte

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

WBOY
Libérer: 2023-08-24 15:53:09
avant
1104 Les gens l'ont consulté

在 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));
Copier après la connexion

Sortie

2
Copier après la connexion

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!

source:tutorialspoint.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal