|
@ -1,6 +1,7 @@ |
|
|
# BELLYNCK Manon |
|
|
# BELLYNCK Manon |
|
|
# GUILLAUMIN-TORRES Ambre |
|
|
# GUILLAUMIN-TORRES Ambre |
|
|
# COVIN Clara |
|
|
# COVIN Clara |
|
|
|
|
|
from Pile import Pile_lst as Pile |
|
|
|
|
|
|
|
|
class Expression: |
|
|
class Expression: |
|
|
"""représente une expression arithmétique sous forme d'un arbre""" |
|
|
"""représente une expression arithmétique sous forme d'un arbre""" |
|
@ -10,6 +11,7 @@ class Expression: |
|
|
self.droit = fils_droit |
|
|
self.droit = fils_droit |
|
|
|
|
|
|
|
|
def evalue (self) : |
|
|
def evalue (self) : |
|
|
|
|
|
""" Permet de renvoyer la valeur de l’expression""" |
|
|
if self.gauche == None and self.droit == None : |
|
|
if self.gauche == None and self.droit == None : |
|
|
return self.val_racine |
|
|
return self.val_racine |
|
|
|
|
|
|
|
@ -29,32 +31,35 @@ class Expression: |
|
|
return gauche_val - droite_val |
|
|
return gauche_val - droite_val |
|
|
elif self.val_racine == '*': |
|
|
elif self.val_racine == '*': |
|
|
return gauche_val * droite_val |
|
|
return gauche_val * droite_val |
|
|
|
|
|
elif self.val_racine == '/': |
|
|
|
|
|
return gauche_val / droite_val |
|
|
else : |
|
|
else : |
|
|
raise ValueError ("Cette commande ne peut pas être effectuer") |
|
|
raise ValueError ("Cette commande ne peut pas être effectuer") |
|
|
|
|
|
|
|
|
def __str__(self): |
|
|
def __str__(self): |
|
|
|
|
|
"""Permet d'afficher une expression en ligne, représenter par un arbre""" |
|
|
result = "" |
|
|
result = "" |
|
|
if self.droit: |
|
|
if self.droit: |
|
|
result = result + str(self.droit) |
|
|
result = result + str(self.droit) |
|
|
result = result + str(self.val_racine) + "\n" """le "/n" c'est pour avoir une nouvelle ligne de l'arbre""" |
|
|
result = result + str(self.val_racine) + "\n" #le "/n" c'est pour avoir une nouvelle ligne de l'arbre |
|
|
if self.gauche: |
|
|
if self.gauche: |
|
|
result += str(self.gauche) |
|
|
result += str(self.gauche) |
|
|
return result |
|
|
return result |
|
|
|
|
|
|
|
|
def npi2tree(liste_npi): |
|
|
def npi2tree(lst): |
|
|
"""Convertit une liste représentant une expression en notation polonaise inversée en un arbre d'expression.""" |
|
|
"""Convertit une liste représentant une expression en notation polonaise inversée en un arbre d'expression.""" |
|
|
pille = [] |
|
|
pille = Pile () |
|
|
for element in liste_npi: |
|
|
for element in lst: |
|
|
# Si c'est un opérateur (+, -, * ou /), on crée un nœud opérateur |
|
|
# Si c'est un opérateur (+, -, * ou /), on crée un nœud opérateur |
|
|
if element in ('+', '-', '*', '/'): |
|
|
if element in ('+', '-', '*', '/'): |
|
|
droit = pille.pop() |
|
|
droit = pille.depiler() |
|
|
gauche = pille.pop() |
|
|
gauche = pille.depiler() |
|
|
pille.append(Expression(element, gauche, droit)) # Créer un nouvel arbre et empiler |
|
|
pille.empiler(Expression(element, gauche, droit)) # Créer un nouvel arbre et empiler |
|
|
else: |
|
|
else: |
|
|
# Sinon, ça veut dire que c'est un nombre donc on le convertit et on l'empile. |
|
|
# Sinon, ça veut dire que c'est un nombre donc on le convertit et on l'empile. |
|
|
pille.append(Expression(int(element), None, None)) |
|
|
pille.empiler(Expression(int(element), None, None)) |
|
|
|
|
|
|
|
|
return pille[0] # Retourne l'arbre complet |
|
|
return pille.depiler() # Retourne l'arbre complet |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -75,3 +80,8 @@ assert exp.evalue() == 24 |
|
|
|
|
|
|
|
|
exp = Expression('-', Expression(45,None,None), Expression(3,None,None))#ça marche comme ça |
|
|
exp = Expression('-', Expression(45,None,None), Expression(3,None,None))#ça marche comme ça |
|
|
assert exp.evalue() == 42 |
|
|
assert exp.evalue() == 42 |
|
|
|
|
|
|
|
|
|
|
|
liste_npi = ["6", "4", "3", "+", "*"] # Correspond à 6 * (4 + 3) |
|
|
|
|
|
arbre = npi2tree(liste_npi) # Convertit la liste en un arbre |
|
|
|
|
|
|
|
|
|
|
|
print(arbre.evalue()) # Affiche : 42 |