#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Calculatrice polonaise inverse d'entiers (utilise le module pile_m).

Algorithme :
- Entrée : expression rpn (chaîne).
- Sortie : valeur de cette expression.
Partir avec une pile vide.
Pour chaque item de l'expression (lue de gauche à droite) :
  - si l'item est un nombre, alors l'empiler,
  - si l'item est un opérateur "op", alors :
    - depiler une fois : nombre b,
    - dépiler une seconde fois : nombre a,
    - calculer : a op b,
    - empiler le résultat.
À la fin, la pile ne contient qu'un item, le résultat du calcul.

Exemples :
8 2 / 3 * 7 +  =>  4 3 * 7 +  =>  12 7 +  =>  19
11 9 4 3 + - *  =>  11 9 7 - *  =>  11 2 *  =>  22

fichier : pile_m.py
auteur : Bob sur une idée d'Arnaud Bodin
"""

# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from pile_m import empile, depile

# Global ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ops = "+-*/"

# Définition fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def RPN(exp):
    """Mise en œuvre de l'algorithme."""
    for item in exp:
        if item.isdigit():
            empile(int(item))
        else:
            if item in ops:
                b = depile()
                a = depile()
                match item:
                    case "+": empile(a + b)
                    case "-": empile(a - b)
                    case "*": empile(a * b)
                    case "/": empile(a // b)


# Programme principal ==========================================================
while True:
    exp = input("\nEntrez une expression (ligne vide pour terminer)  : ").split()
    if exp:  # tant que 'exp' est True (non vide)
        RPN(exp)
        print(f"Résultat : {depile()}")
    else:
        print("\nTerminé !")
        break
