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.
88 lines
3.1 KiB
88 lines
3.1 KiB
from data_structure import *
|
|
|
|
class Expression:
|
|
"""manipule les expression sous forme d'arbre"""
|
|
def __init__(self, val, fils_gauche, fils_droit) -> None:
|
|
self.val = val
|
|
self.fils_gauche = fils_gauche
|
|
self.fils_droit = fils_droit
|
|
|
|
def __str__(self) -> str:
|
|
"""renvoie l'expression sous forme infixé"""
|
|
if self.est_feuille():
|
|
return str(self.val)
|
|
return '('+self.fils_gauche.__str__()+str(self.val)+self.fils_droit.__str__()+')'
|
|
|
|
def est_feuille(self) -> bool:
|
|
"""renvoie true si le noeud est une feuille"""
|
|
if self.fils_droit is None and self.fils_gauche is None:
|
|
return True
|
|
return False
|
|
|
|
def evalue(self) -> float:
|
|
"""renvoie le résultat de l'expression"""
|
|
if self.est_feuille():
|
|
return float(self.val)
|
|
if self.val == '+':
|
|
return self.fils_gauche.evalue() + self.fils_droit.evalue()
|
|
if self.val == '*':
|
|
return self.fils_gauche.evalue() * self.fils_droit.evalue()
|
|
if self.val == '/':
|
|
return self.fils_gauche.evalue() / self.fils_droit.evalue()
|
|
if self.val == '^':
|
|
return self.fils_gauche.evalue() ** self.fils_droit.evalue()
|
|
if self.val == '-':
|
|
return self.fils_gauche.evalue() - self.fils_droit.evalue()
|
|
|
|
def npi2tree(expr: list) -> Expression:
|
|
"""renvoie l'arbre formé a partir de l'expression donnée"""
|
|
pile = Pile_chaine()
|
|
for val in expr:
|
|
if not val.isdigit():
|
|
# on inverse pour avoir les nombres dans le bon ordre
|
|
nombre2, nombre1 = pile.depiler(), pile.depiler()
|
|
pile.empiler(Expression(val, nombre1, nombre2))
|
|
else:
|
|
pile.empiler(Expression(int(val), None, None))
|
|
return pile.sommet()
|
|
|
|
def inf2npi(expr: list) -> list:
|
|
operator_stack = Pile_chaine()
|
|
operator_priority = {
|
|
'+': 1,
|
|
'-': 1,
|
|
'*': 2,
|
|
'/': 2,
|
|
'(': 0,
|
|
')': 0
|
|
}
|
|
output = []
|
|
for val in expr:
|
|
if val.isdigit():
|
|
output.append(val)
|
|
else:
|
|
if operator_stack.est_vide() or ( val == '(' or operator_priority[val] > operator_priority[operator_stack.sommet()]):
|
|
operator_stack.empiler(val)
|
|
else:
|
|
while not operator_stack.est_vide():
|
|
if operator_stack.sommet() == '(':
|
|
operator_stack.depiler()
|
|
if operator_stack.est_vide(): # test si il y a un astérix avant la parenthèse
|
|
output.append('*')
|
|
elif operator_stack.sommet() != '*':
|
|
output.append('*')
|
|
else:
|
|
output.append(operator_stack.depiler())
|
|
else:
|
|
output.append(operator_stack.depiler())
|
|
if val != ')':
|
|
operator_stack.empiler(val)
|
|
while not operator_stack.est_vide():
|
|
output.append(operator_stack.depiler())
|
|
return output
|
|
|
|
# [3, '-', 6, '*', 4, '+', 3]
|
|
exp = inf2npi(list('6*(4+3)'))
|
|
print(exp)
|
|
|
|
print(npi2tree(exp))
|