You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.0 KiB
73 lines
2.0 KiB
"""
|
|
Il aurait été intéressant de laisser quelques te,sts.
|
|
Que se passe-t-il si liste_npi n'est pas valide
|
|
"""
|
|
|
|
from Pile import Pile_lst
|
|
|
|
|
|
class Expression:
|
|
"""
|
|
Représente une expression arithmétique sous forme d’arbre binaire.
|
|
"""
|
|
|
|
def __init__(self, valeur, gauche=None, droit=None):
|
|
"""
|
|
Initialise un noeud avec une valeur ('+', '*' ou entier)
|
|
et éventuellement deux sous-arbres gauche et droit.
|
|
"""
|
|
self.valeur = valeur
|
|
self.gauche = gauche
|
|
self.droit = droit
|
|
|
|
def evalue(self):
|
|
"""
|
|
Évalue récursivement l'expression et renvoie sa valeur entière.
|
|
"""
|
|
# Cas feuille (entier)
|
|
if self.gauche is None and self.droit is None:
|
|
return self.valeur
|
|
|
|
# Cas opérateur
|
|
if self.valeur == "+":
|
|
return self.gauche.evalue() + self.droit.evalue()
|
|
elif self.valeur == "*":
|
|
return self.gauche.evalue() * self.droit.evalue()
|
|
else:
|
|
raise ValueError("Opérateur inconnu")
|
|
|
|
def __str__(self):
|
|
"""
|
|
Renvoie une chaîne représentant l’expression avec parenthèses.
|
|
"""
|
|
# Cas feuille
|
|
if self.gauche is None and self.droit is None:
|
|
return str(self.valeur)
|
|
|
|
# Cas opérateur
|
|
return "(" + str(self.gauche) + self.valeur + str(self.droit) + ")"
|
|
|
|
|
|
def npi2tree(liste_npi):
|
|
"""
|
|
Convertit une liste d’éléments en notation polonaise inversée (NPI)
|
|
en un arbre d’expression de type Expression.
|
|
"""
|
|
pile = Pile_lst()
|
|
|
|
for elem in liste_npi:
|
|
|
|
# Si c'est un opérateur
|
|
if elem == "+" or elem == "*":
|
|
droit = pile.depiler()
|
|
gauche = pile.depiler()
|
|
exp = Expression(elem, gauche, droit)
|
|
pile.empiler(exp)
|
|
|
|
# Sinon c'est un entier
|
|
else:
|
|
nombre = int(elem)
|
|
exp = Expression(nombre, None, None)
|
|
pile.empiler(exp)
|
|
|
|
return pile.sommet()
|