# BELLYNCK Manon # GUILLAUMIN-TORRES Ambre # COVIN Clara from Pile import Pile_lst as Pile class Expression: """représente une expression arithmétique sous forme d'un arbre""" def __init__ (self, valeur_racine, fils_gauche, fils_droit): self.val_racine = valeur_racine self.gauche = fils_gauche self.droit = fils_droit def evalue (self) : """ Permet de renvoyer la valeur de l’expression""" if self.gauche == None and self.droit == None : return self.val_racine if self.gauche != None: #on ne met pas elif car les cas sont indépendants" gauche_val = self.gauche.evalue() else: gauche_val = 0 if self.droit != None: droite_val = self.droit.evalue() else: droite_val = 0 #Les opérations possibles : addition, soustraction, mutliplication, division, puissance. if self.val_racine == '+': return gauche_val + droite_val elif self.val_racine == '-': return gauche_val - droite_val elif self.val_racine == '*': return gauche_val * droite_val elif self.val_racine == '/': return gauche_val / droite_val elif self.val_racine == '^': return gauche_val ** droite_val else : raise ValueError ("Cette commande ne peut pas être effectuer") def __str__(self): """Permet d'afficher une expression en ligne, représenter par un arbre""" result = "" if 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 if self.gauche: result += str(self.gauche) return result def npi2tree(lst): """Convertit une liste représentant une expression en notation polonaise inversée en un arbre d'expression.""" pile = Pile () for element in lst: # Si c'est un opérateur (+, -, * ou /), on crée un nœud opérateur if element in ('+', '-', '*', '/','^'): droit = pile.depiler() gauche = pile.depiler() pile.empiler(Expression(element, gauche, droit)) # Créer un nouvel arbre et empiler else: # Sinon, ça veut dire que c'est un nombre donc on le convertit et on l'empile. pile.empiler(Expression(int(element), None, None)) return pile.depiler() # Retourne l'arbre complet #test: exp = Expression(5,None,None) assert exp.evalue() == 5 exp = Expression('+', Expression(8,None,None), Expression(3,None,None))#ça marche comme ça assert exp.evalue() == 11 #exp = Expression('+', 8, 3)#mais ça marche pas comme ça, je sais pas trop comment régler ça #assert exp.evalue() == 11 exp = Expression('*', Expression(8,None,None), Expression(3,None,None))#ça marche comme ça assert exp.evalue() == 24 exp = Expression('-', Expression(45,None,None), Expression(3,None,None))#ça marche comme ça assert exp.evalue() == 42 lst = ["6", "4", "3", "+", "*"] # Correspond à 6 * (4 + 3) arbre = npi2tree(lst) # Convertit la liste en un arbre print(arbre.evalue()) # Affiche : 42