Lors de l'écriture de code, nous rencontrons parfois des situations où nous devons analyser les quatre expressions arithmétiques par nous-mêmes. Cet article présente brièvement l'utilisation de JavaScript pour implémenter l'analyse de quatre expressions arithmétiques simples.
1. Familière le concept
La notation (ou notation de l'infixation) est une méthode de représentation de formule arithmétique générale ou logique. L'opérateur est au milieu de l'opérande sous la forme d'une infixe (exemple: 3 + 4). Autrement dit, nous utilisons les expressions arithmétiques les plus couramment utilisées. Les expressions infixes sont plus faciles à comprendre pour les humains, mais ne sont pas faciles pour l'analyse informatique.
La notation polonaise inversée (RPN, ou notation polonaise inverse) est une méthode d'expression mathématique introduite par le mathématicien polonais Jan Vukasevich en 1920. Dans la notation polonaise inverse, tous les opérateurs sont placés derrière l'opérande, il est donc également appelé la notation du suffixe. La notation de polissage inverse ne nécessite pas de supports pour identifier la priorité de l'opérateur. La notation polonaise inverse est facile à utiliser une structure de pile pour analyser et calculer l'expression, donc nous analysons ici les expressions de quatre éléments, qui convertit d'abord de l'expression de l'infixation en expression polonaise inverse. Calculez ensuite la valeur.
2. Processus de conversion
Convertir une expression de l'infixe en une expression de suffixe (algorithme de champ de planification)
1. Entrez dans la file d'attente et faites éclater une marque
2. Si la marque est un nombre, ajoutez-le à la file d'attente de sortie
3. S'il s'agit d'un opérateur (+ - * /), comparez-le avec l'opérateur en haut de la pile dans la pile de sortie. Si la priorité est inférieure ou égale à l'opérateur en haut de la pile, faites apparaître l'opérateur en haut de la pile et ajoutez-le à la file d'attente de sortie (boucle jusqu'à ce que les conditions ci-dessus ne soient pas remplies), et enfin poussez l'opérateur sur la pile.
4. S'il s'agit d'un support gauche, poussez-le dans la pile
5. S'il s'agit d'un support proche, l'opérateur est constamment sorti de la pile et ajouté à la file d'attente de sortie, et sachez que l'élément en haut de la pile est le support gauche. Le support gauche apparaît et n'ajoute pas la file d'attente de sortie. Si aucun support gauche n'est trouvé, cela signifie que les supports de l'expression d'origine sont asymétriques et qu'il y a une erreur.
6. Si la file d'attente d'entrée est vide et qu'il y a encore des opérateurs dans la pile, si l'opérateur en haut de la pile est du support gauche, cela signifie que l'expression d'origine a des supports incompatibles. Faites apparaître les opérateurs dans la pile un par un et ajoutez-les à la file d'attente de sortie.
7. Complété
3. Convertir l'implémentation du code
fonction isOperator (value) {var operatorstring = "+ - * / ()"; return operatorString.Indexof (value)> -1} function getPrioraty (value) {switch (value) {case '+': case '-': return 1; case '*': case '/': return 2; Default: return 0;}} function priority (o1, o2) {return getPoraty (o1) <= o2, o2) {return GetPoraty (o1) <= o2) {return GetPrioraty (o1) <Sory) getPrioraty (o2);} fonction dal2rpn (exp) {var inputStack = []; var outputStack = []; var outputQueue = []; for (var cur = 0, len = exp.length; i <len; i ++) {var cur = exp [i]; if (cur! = '') {inputStack.push (cur);}} while (inputStack.length> 0) {var cur = inputStack.shift (); if (isOperator (cur)) {if (cur == '(') {outputStack.push (cur);} else if (cur == ')') {var po = outputStack.pop (); while (po! = '(' && outputStack.Length> 0) {outputQueue.push (po); po = outputStack.pop ();} if (po! = '(') {throw "error: non-rached ()";}} else {while (whiledaty.Length> 8 == '(') {Throw "Erreur: non correspondant ()";} while (outputStack.length> 0) {outputQueue.push (outputStack.pop ());}} console.log ('étape trois'); returnputQueue;} console.log (dal2rpn ('1 + 2')); 3 ')); console.log (dal2rpn (' 1 + 2 * 3 ')); console.log (dal2rpn (' 1 + 2 * 3 - 4/5 ')); console.log (dal2rpn (' (1 + 2) ')); console.log (dal2rpn (' (1 + 2) * (3 - 4) / 5 ')); console.log (dal2rpn (' (1 + 2) * ((3 - 4) / 5) '));4. Évaluation de l'expression polonaise inverse
1. Appartez une marque de la file d'attente d'entrée
2. S'il s'agit d'un opérande, ajoutez-le à la pile de sortie
3. S'il s'agit d'un opérateur, proposez deux opérandes de la pile de sortie et calculez, et poussez la valeur calculée dans la pile de sortie.
4. Fonctionnement de la boucle. Si la file d'attente d'entrée est vide et qu'il n'y a qu'un seul numéro sur la pile de sortie, ce nombre est le résultat, sinon il y aura un opérande inutile.
5. Calculez le code
Fonction EVAMRPN (RpnQueue) {var OutputStack = []; while (RpnQueue.length> 0) {var cur = rpnqueue.shift (); if (! isOperator (cur)) {outputStack.push (cur);} else {if (outputStack.Length <2) {thord "unvalid stack Longue outputStack.pop (); outputStack.push (getResult (fir, sec, cur));}} if (outputStack.length! = 1) {thork "Unvalid Expression";} else {return sutputStack [0];}}6. Conclusion
La représentation du polonais inverse ne s'y est pas habituée lorsque vous entrez en contact avec elle, mais après s'être familiarisé, vous constaterez que l'idée est en fait très simple, contrairement à la représentation de l'infix, qui a diverses priorités, et il y a des supports, qui sont particulièrement gênants. La représentation du polonais inverse est relativement concise, et il n'est pas nécessaire de considérer la priorité, et il n'est pas nécessaire d'utiliser des supports, des supports et des accolades pour perturber la situation.