Exercice sur les piles et l'écriture polonaise

Nitram140 -  
 Nitram140 -
Bonjour, ma consigne est la suivante : écrivez en Python une fonction qui prend en paramètre une liste contenant la représentation en notation postfixée d'une expression arithmétique et qui renvoie sa valeur.

Je me suis donc lancé et j'ai réalisé le programme postf en utilisant des fonctions classiques pour manipuler les piles.

je m'y prends de la manière suivante : si un élément de la liste est un nombre, je l'empile ; si c'est un opérateur, je dépile les deux éléments de la pile et je fait le calcul puis j'empile le résultat.

#Création d'une pile#
def creer_pile():
    return[]

#Empilement d'une valeur#
def empiler(p,val):
    """ajout de val au sommet de p"""
    p.append(val)
    return(p)
#Nombre d'éléments#
def taille(p):
    """calcul du nombre d'éléments"""
    return(len(p))

#Test de vacuité#
def est_vide(p):
    """True si vide, False sinon"""
    return(len(p)==0)

#Dépilement d'une valeur#
def depiler(p):
    """suppression et renvoi du sommet"""
    if not est_vide(p):
        return(p.pop())

#Lecture de la valeur au sommet#
def sommet(p):
    """renvoi de la valeur sommet"""
    if not est_vide(p):
        return(p[-1])

def postf(liste):
    pile=[]         
    liste2=[]       #liste annexe pour les calculs
    for k in liste:     
        if k!="+" and "-" and "*" and "/":     #on empile si l'élément n'est pas un opérateur
            empiler(pile, k)

        else:
            while taille(pile)!=taille(pile)-2: #sinon on depile deux éléments qu'on empile dans la liste annexe  
                empiler(liste2,depiler(pile))
            
            for i in range(len(liste2)): #en utilisant cette liste annexe on peut réaliser les calculs selon la condition sur k
                if k=="+":
                    r=liste2[i]+liste2[i+1]
                elif k=="-":
                    r=liste2[i]-liste2[i+1]
                elif k=="*":
                    r=liste2[i]*liste2[i+1]
                elif k=="/":
                    r=liste2[i]/liste2[i+1]
            empiler(pile,r)    

    return(pile, ann)


Mon soucis est que mon while ne boucle pas et je ne comprends pas pourquoi vu que je dépile à l'intérieure de cette boucle ce qui devrait diminuer la taille de la pile dont je veux enlever les deux éléments pour réaliser par la suite l'opération.
Merci d'avance.



Configuration: Windows / Chrome 93.0.4577.63
A voir également:

2 réponses

Pierrecastor Messages postés 41491 Date d'inscription   Statut Modérateur Dernière intervention   4 149
 
Salut,

Pour les prochaines fois, utilise la balise <code python> au lieu de code, ça ajoute la coloration syntaxique et c'est bien plus lisible.

Bien castorement
0
Nitram140
 
d'accord, merci du conseil
0