| UPNStackOO.java |
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