1   import java.util.Scanner;
2   /**
3    * 183.592 Programmierpraxis TU Wien WS2014/15 H.Moritsch
4    * Rechnen mit Umgekehrt Polnischer Notation (UPN) 
5    * mit einem Stack-Speicher: die Ausführung einer Operation 
6    * nimmt die zwei obersten Elemente vom Stack, verknüpft 
7    * diese, und legt das Ergebnis wieder auf den Stack.
8    * z. B. (3+6)/4 = 2:
9    *      '3'     legt 3 auf den Stack
10   *      '6'     legt 6 auf den Stack
11   *      '+'     nimmt 6 und danach 3 vom Stack, addiert 
12   *              die beiden, und legt 9 auf den Stack
13   *      '4'     legt 4 auf den Stack
14   *      '/'     nimmt 4 und danach 9 vom Stack, dividiert
15   *              9/4 und legt 2 auf den Stack
16   */
17  public class UPNStackOO {
18      public static void main(String[] args) {
19          Scanner scanner = new Scanner(System.in);
20  
21  
22          Stack stack = new Stack(10);               // leerer Stack mit 10 Elementen
23  
24  
25          while (scanner.hasNext()) {
26  
27              if (scanner.hasNextInt()) {
28  
29                  int zahl = scanner.nextInt();       
30      
31                  if (! stack.offerfirst(zahl) )     // "push" zahl 
32                      System.out.println("Stack ist bereits voll");
33              }
34  
35              else {
36  
37                  String s = scanner.next();
38                  char operation = s.charAt(0);       // '+', '-', '*', '/', oder '%'
39  
40                  int operand2 = stack.pollfirst();    // "pop" liefert den zweiten(!) operanden
41                  int operand1 = stack.pollfirst();    // "pop" liefert den ersten operanden
42                  int ergebnis;
43                  
44                  switch ( operation) {
45  
46                      case '+':   ergebnis = operand1 + operand2;
47                      break;
48  
49                      case '-':   ergebnis = operand1 - operand2;
50                      break;
51  
52                      case '*':   ergebnis = operand1 * operand2;
53                      break;
54  
55                      case '/':   ergebnis = operand1 / operand2;
56                      break;
57  
58                      case '%':   ergebnis = operand1 % operand2;
59                      break;
60      
61                      default:    System.out.println("keine gültige Operation");
62                                  ergebnis = -999999;
63                  }
64  
65              System.out.println("=" + ergebnis);
66  
67              stack.offerfirst(ergebnis);        // "push" ergebnis 
68              }
69   
70          }   
71  
72      }
73  }
74