TP - Pile (correction)

  1. Écrire la fonction est_operateur(c: str) qui prend en entrée un caractère et renvoie True s'il s'agit d'un opérateur, False sinon. On peut avoir besoin de la fonction c.isdigit() (attention, ne fonctionne que sur des str).

def est_operateur(c: str): return c=='+' or c=='-' or c=='*' or c=='/'
  1. Écrire la fonction calcul(op: str, a: int, b: int) qui prend en paramètre un opérateur op parmis les 4 autorisés, et deux entiers a et b. Elle renvoie le résultat du calcul a op b.

def calcul(op: str, a: int, b: int): if op == '+': return a + b elif op == '-': return a - b elif op == '*': return a * b else: return a / b
  1. Écrire la fonction evaluation(expr: list) qui prend en paramètre une expression sous la forme d'un tableau de caractère correspondant à une formule en NPI. Elle renvoie le résultat du calcul de l'expression.

def evaluation(expr: list | str): # ça marche avec des str également! pile = pile_creer() for c in expr: if c.isdigit(): pile_empiler(pile, int(c)) elif est_operateur(c): a = pile_depiler(pile) b = pile_depiler(pile) resultat = calcul(c, a, b) pile_empiler(pile, resultat) return pile_sommet(pile)
  1. Réécrire les fonctions correspondants aux primitives de pile en stockant les éléments dans un tableau python. Ci-dessous des indications pour "traduire" un tableau en pile.

def pile_creer(): return [] def pile_taille(pile): return len(pile) def pile_est_vide(pile): return pile_taille(pile) == 0 def pile_empiler(pile, element): pile.append(element) def pile_depiler(pile): return pile.pop() def pile_sommet(pile): return pile[-1]