Umgekehrte Polnische Notation / Postfix-Notation über Stack programmieren, so richtig?

3 Antworten

Nur am Rande, Du brauchst die Werte nicht in Variablen zu holen, ein s.push(s.pop()+s.pop()) etc. funktioniert genauso gut.

Das an die History COmpare Funktion übergebene String Array ist 14 Elemente lang, die interne History demnach vorgeblich 0. Warum das so ist könnte man lediglich sagen, wenn man die Implementierung des Stacks kennen würde.

Ah, da liegt der Hund begraben: Im Calculator reinstanziierst Du s, Du solltest aber natürlich den übergebenen Stack nehmen, dessen compare methode danach aufgerufen wird ;-).

Vorab: alle else-Zweige in Calculator() sind falsch. Macht hier aber nix, weil y==0 im Test nie auftritt.

Ich vermute (wegen "target length = 14"), dass der erste Eintrag in der Stack-History der Startzustand "[]" ist. Das fehlt in Deinem Vergleichs-Array.

computerfan001 
Fragesteller
 24.08.2020, 11:46

Danke für die Antwort. Wie kann man das beheben? Ich habe es versucht mit if(input[i] == null) {s.push(0); } in der default Anweisung-> hat leider nicht geklappt.

0
ralphdieter  24.08.2020, 11:51
@computerfan001

Der default-Zweig ist nicht das Problem. Ich meinte das hier:

System.out.println(s.compareHistory(new String[] {
  "[]",   // <==== Startzustand
  "[1]",
0
ralphdieter  24.08.2020, 13:08

Autsch! Der Fehler liegt in der ersten Zeile von Calculator() :

  s = new IntegerStack()

Damit überschreibst Du den Funktionsparameter. Der übergebene Stack bleibt damit unbenutzt und leer.

Lösch diese Zeile.

0

Warum triffst Du bei allen Operationen die Unterscheidung ob y != 0 ist oder nicht?

Das dürfte zu Fehlern führen, denn Du machst ja dann drei pops auf dem Stack anstatt nur zwei.

computerfan001 
Fragesteller
 24.08.2020, 11:15

Danke für die Antwort, auch ohne Fallunterscheidung klappt es nicht. Ich hatte gedacht, eine Fallunterscheidung sei nötig, um die leeren Felder zu eliminieren, hatte die daher im Nachhinein ergänzt. Hat nichts gebracht.
Die Anzahl an pops war jedoch trotzdem immer nur 2x

0
computerfan001 
Fragesteller
 24.08.2020, 11:19
@computerfan001

*anzahl an pops war jedoch trotzdem für den Testfall unerheblich, leider, sonst wäre es gelöst :)

0
computerfan001 
Fragesteller
 24.08.2020, 11:24
@ohwehohach

Konnte es nicht mehr bearbeiten, meinte folgendes als Satz: *anzahl an pops war jedoch trotzdem für den Testfall unerheblich, leider, sonst wäre es gelöst :)
Hast du sonst eine weitere Vermutung, woran der Fehler liegen kann?

0
ohwehohach  24.08.2020, 11:25
@computerfan001

Nee, ist überhaupt nicht unerheblich! Du machst nämlich dann einen POP auf dem leeren Stack.

Hast Du mal den Debugger verwendet um genau zu sehen, was passiert?

0
ohwehohach  24.08.2020, 11:37
@computerfan001

Der spuckt auch nichts aus - Du setzt einen Breakpoint, gehst dann im Einzelschritt durch den Code und schaust, was in den Variablen steht.

0
ralphdieter  24.08.2020, 11:39
@ohwehohach
einen POP auf dem leeren Stack

nur wenn y==0. Das tritt im Test aber nirgends auf.

0
ohwehohach  24.08.2020, 11:50
@ralphdieter

Kann ich nicht mehr nachvollziehen, weil die Fragestellung geändert wurde. Aber sei's drum - die Frage, ob das Ding richtig rechnet, lässt sich durch einen Breakpoint und Variable Inspection ganz einfach beantworten.

1
ralphdieter  24.08.2020, 11:54
@ohwehohach
ob das Ding richtig rechnet

Dazu muss man eigentlich nur die push() und pop() im Code zählen :-)

0