Le problème consiste à créer une sorte de calculatrice qui permet de calculer les expressions écrites dans la notation polonaise inverse (NPI).
Cette notation transforme une expression écrite avec des paranthèses comme celle-ci « 3 × (4 + 7) » en une expression écrite différemment. Donc en notation polonaise inverse l'expression
« 3 × (4 + 7) » s'écrit « 4 7 + 3 × ».
On doit stocker tous les nombres qu'on croise. Bien sûr on parcours l'expression depuis son début. Quand on passe par un opérateur, on doit sortir du stockage les 2 derniers nombres enregistrés, faire un calcul de ces 2 nombres et l'opérateur puis stocker le résultat du calcul. À la fin du code, il n'y aura qu'une valeur stockée.
Pour une facilité de compréhension, voici un exemple : « 4 7 5 - 3 * + » qui peut aussi être écrit comme ceci « (7 - 5) x 3 + 4 ».
Entrée | Stockage des données |
---|---|
4 | 4 |
7 | 4 7 |
5 | 4 7 5 |
- | 4 2 |
3 | 4 2 3 |
* | 4 6 |
+ | 10 |
Le type que j'ai utilisé pour résoudre ce problème est une pile car dans l'énoncé il est dit qu'il faut les 2 dernières valeurs enregistrées pour faire le calcul. Et que la pile est le type de donnée où ce sont les derniers éléments enregistrés qui sortent en premier.
Mon code est en 2 parties.
La première partie est un test pour vérifier que le code est bien écrit et qu'il n'y aura pas de problème si l'expression fournie par l'utilisateur contient une erreur. Pour cela j'ai vérifié qu'il y a un opérateur de moins que de nombre et qu'il y a au moins 2 nombres au début de la formule arithmétique, sinon le premier calcul ne pourra pas être calculé et cela causera une erreur.
La deuxième partie parcourt le code et fait les calculs quand c'est nécessaire. Dans cette partie quand on croise un opérateur, on dépile les 2 dernières valeurs stockées et normalement s'il n'y a pas de problème de test alors les valeurs stockées sont uniquement des nombres. Après chaque calcul, on doit transformer le int en str sinon la fonction eval utilisée dans cette fonction ne fonctionnera pas car elle ne marche qu'avec des str.