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.
63 lines
2.1 KiB
63 lines
2.1 KiB
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())
|