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);
}
}