import java.util.*; /** * Exercice : rajouter l'opérateur - de soustraction (attention à l'ordre * de dépilement... Cet opérateur n'est pas symétrique * Exercice : rajouter l'opérateur / de division entière... * piège supplémentaire (la division par 0) * Exercice : modifier le code de façon à factoriser les opérations de * dépilement des opérandes et empilement du résultat (tous les opérateurs * d'arité 2 ont le même comportement... * Exercice : Rajouter des contrôles de sorte que si l'expression entrée est * incorrecte, un message adéquat soit affiché... */ public class Arith { public static void main(String []args) { // On part d'une pile vide Stack<Integer> maPile = new Stack<Integer>(); Scanner s = new Scanner(System.in); while (s.hasNext()) { String chaine = s.nextLine(); try { // On essaie de décoder la ligne lue comme un entier, si // c'est possible cet entier est poussé en sommet de pile int valeur = Integer.parseInt(chaine); maPile.push(valeur); } catch(NumberFormatException e) { // Si la ligne ne représente pas un entier, on suppose que // c'est un opérateur... // Si c'est * on retire deux entiers en sommet de pile on // effectue la multiplication et on pousse le résultat sur la pile if (chaine.charAt(0)=='*') { int v1 = maPile.pop(); int v2 = maPile.pop(); int r = v1*v2; maPile.push(r); } // Si c'est * on retire deux entiers en sommet de pile on // effectue la multiplication et on pousse le résultat sur la pile if (chaine.charAt(0)=='+') { int v1 = maPile.pop(); int v2 = maPile.pop(); int r = v1+v2; maPile.push(r); } } // On affiche la pile après chaque lecture et calcul... System.out.println(maPile); } int resultatFinal = maPile.pop(); System.out.println(resultatFinal); } }