diff --git a/Pile.py b/Pile.py new file mode 100644 index 0000000..3f198b5 --- /dev/null +++ b/Pile.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from listeChaine import ListeChaine + +class Pile_lst: + """Implémentation d'une pile par une liste.""" + def __init__(self): + """Crée une pile vide.""" + self.__pile = [] + + def est_vide(self): + """Indique si la pile est vide.""" + return self.__pile == [] + + def empiler(self, valeur): + """Empile la valeur.""" + self.__pile.append(valeur) + + def depiler(self): + """Dépile le sommet de la pile et le renvoie.""" + return self.__pile.pop() + + def taille(self): + """Renvoie la taille de la pile.""" + return len(self.__pile) + + def sommet(self): + """Renvoie le sommet de la pile (sans le dépiler).""" + return self.__pile[-1] + + def __str__(self): + s = "|" + for val in self.__pile: + s = str(val) + "->" + s + return s + + +class Pile_chaine: + """Implémentation d'une pile par une liste chaînée.""" + def __init__(self): + """Crée une pile vide.""" + self.__pile = ListeChaine() + self.__taille = 0 + + def est_vide(self): + """Indique si la pile est vide.""" + return self.__taille == 0 + + def empiler(self, valeur): + """Empile la valeur.""" + self.__pile.ajoute(valeur) + self.__taille += 1 + + def depiler(self): + """Dépile le sommet de la pile et le renvoie.""" + if self.est_vide(): + raise IndexError("Impossible de dépiler une pile vide.") + valeur = self.__pile.tete() + self.__pile = self.__pile.queue() + self.__taille -= 1 + return valeur + + def taille(self): + """Renvoie la taille de la pile.""" + return self.__taille + + def sommet(self): + """Renvoie le sommet de la pile (sans le dépiler).""" + if self.est_vide(): + raise IndexError("Une pile vide n'a pas de sommet.") + return self.__pile.tete() + + def __str__(self): + return str(self.__pile) + "->|" + + +if __name__ == "__main__": + p = Pile_lst() + print(p.est_vide()) + p.empiler('A') + p.empiler('B') + p.empiler('C') + print(p.est_vide()) + print(p.sommet()) + print(p) + print(p.taille()) + print(p.depiler()) + print(p.depiler()) + print(p.depiler()) + print(p.est_vide()) diff --git a/calculatrice.py b/calculatrice.py index 6c3683b..59255b0 100644 --- a/calculatrice.py +++ b/calculatrice.py @@ -1,2 +1,34 @@ +from Pile import Pile_lst +import tkinter as tk + class Expression: - \ No newline at end of file + def __init__(self, valeur, gauche, droite): + self.valeur = valeur + self.gauche = gauche + self.droite = droite + + def evalue(self): + if self.valeur == '+': + return self.gauche.evalue() + self.droite.evalue() + if self.valeur == '*': + return self.gauche.evalue() * self.droite.evalue() + else: + return self.valeur + + def __str__(self): + if self.valeur != '+' and self.valeur != '*': + return self.valeur + if self.valeur == '+' or self.valeur == '*': + return "(" + str(self.gauche.__str__()) + str(self.valeur) + str(self.droite.__str__()) + ")" + +def npi2tree(exp): + pile_npi = Pile_lst() + lst_npi = exp.split() + for element in lst_npi: + if element == '+' or element == '*': + exp_npi = Expression(element, pile_npi.depiler(), pile_npi.depiler()) + pile_npi.empiler(exp_npi) + else: + pile_npi.empiler(int(element)) + return pile_npi.sommet() +