Calculatrice Java, comment gérer les nombres négatifs


Je crée une calculatrice en Java et j'ai du mal à trouver un moyen de gérer les nombres négatifs, jusqu'à présent, je peux analyser une expression, par exemple ceci:

((4-3)*(4/2))*2

Devient:

[4.0, -3.0, +, 4.0, 2.0, /, *, 2.0, *]

Cependant, je ne sais pas comment je traiterais les expressions contenant des négatifs, tels que:

2*(-2-3)

Pour l'instant j'ai que, lorsqu'une valeur négative est rencontré il multiplie le nombre à l'avance par -1 et ajoute un + à la fin de la liste, donc l'expression devient ceci:

[2.0, -2.0, -3.0, +, +, *]

Cela provoque de nombreuses erreurs dans mon programme, quelqu'un peut-il aider avec une meilleure méthode pour traiter les négatifs.

, Merci beaucoup pour toute aide

Author: user3120023, 2014-01-06

3 answers

Vladp est correct, mais pour ajouter quelques précisions.

Vous implémentez l'algorithmeShunting Yard pour transformerinfixation notation enpostfix notation , ALIAS Reverse Polish notation.

Le problème que vous rencontrez est que vous ne faites pas la distinction entre une soustraction binaireet une négation unaire pour le caractère/symbole/opérateur -.

Donc, pour

2*(-2-3)

Vous convertissez cela en AST comme

       *
      / \
  - (b)  2
    / \
- (u)  3
  /
 2

Avec - (b) comme soustraction binaire et - (u) comme négation unaire.

Ou RPN comme

2-3-2*  

Et l'évaluation comme

2 - 3 - 2 *
(-2) 3 - 2 *
(-5) 2 *
-10 

Lorsque vous évaluez une négation unaire, retirez simplement l'opérateur unaire et le numéro suivant de la pile et poussez un négatif de ce nombre sur la pile. Unary negate ne signifie pas multiple par négatif un, mais convertit l'opérande en négatif.

, Donc -5 nié, c'est -5
et 5 nié est -5.

Quand vous stockez les valeurs pour le signe négatif, vous devez utiliser deux opérateurs différents, un pour binaire et un pour unaire. Aussi lorsque vous évaluez les opérateurs, vous devez avoir une affaire distincte pour les opérateurs unaires et binaires.

 2
Author: Guy Coder, 2017-05-23 12:28:42

Faire deux types - différents,

Celui qui fonctionne sur une seule valeur, en la tournant simplement négative:

-(2+3)
[2, 3, +, type1-]

Et deuxième qui fonctionne comme +:

2-3
[2, 3, type2-]

, Ensemble, vous devriez obtenir:

2--3
[2, 3, type1-, type2-]

-2-(-3)
[2, type1-, 3, type1-, type2-]

Lorsque vous rencontrez - sans arguments en attente de calcul, c'est type1 et type2 sinon.

 1
Author: Vladp, 2014-01-06 12:09:38

Eh bien, voici ma valeur de deux cents:

Je soupçonne casser une équation qui contient des parenthèses dans des parenthèses, etc ... dans un tableau comme vous l'avez fait va conduire à beaucoup de difficultés. Je vous suggère plutôt d'explorer par programme les parentises les plus profondes, de traiter les données et de travailler vers l'extérieur. Il pourrait y avoir des exemples en ligne dans Google sur la façon de le faire.

 0
Author: user2810910, 2014-01-06 15:56:53