from Pile import Pile_chaine as Pile import math class Expression: "permet de représenter et manipuler une expression aritpétique sous forme d'un arbre" def __init__(self, racine, gauche, droit): self.racine = racine self.gauche = gauche self.droit = droit def evalue(self): "renvoie la valeur de l'expression" if self.gauche == None and self.droit == None: return self.racine if self.racine == '*': return self.gauche.evalue() * self.droit.evalue() if self.racine == '+': return self.gauche.evalue() + self.droit.evalue() if self.racine == '-': return self.gauche.evalue() - self.droit.evalue() if self.racine == '/': return self.gauche.evalue() / self.droit.evalue() def racine_carre(self): return math.sqrt(self.racine) def __str__(self): "affiche l'expression" exp = "" if self.racine != '*' or self.racine != '+' or self.racine != '-' or self.racine != '/': if self.gauche != None: exp = "(" + exp + str(self.gauche) exp = exp + str(self.racine) if self.droit != None: exp = exp + str(self.droit) +")" return exp def npi2tree(lst): p = Pile() for elem in lst: if elem == '+' or elem =='*' or elem == '-' or elem == '/': racine = elem fils_d = p.depiler() fils_g = p.depiler() exp = Expression(racine, fils_g, fils_d) p.empiler(exp) else : if elem != None: p.empiler(Expression(int(elem), None, None)) return p.sommet() if __name__ == "__main__": exp = Expression('*', Expression('+', Expression(2, None, None), Expression(3, None, None)), Expression(6, None, None)) print(exp.evalue()) print(exp) e = npi2tree([-6, 4, 3, "+", "-"]) print(e.evalue())