2016-12-18 2 views
2

Ich möchte ein Programm schreiben, um die Ausgabe bei arithmetischem Ausdruck zu berechnen. Wie folgt aus:Polnische Notation Implementierung

Meine Eingabe ist: * + * + 1 2 + 3 4 5 6 Mein ausgegeben werden soll: 156

ich ein Java-Programm geschrieben, dies mit Stack-Datentyp zu tun. Hier ist mein Java-Programm:

import java.util.Scanner; 
import java.util.Stack; 


public class Main { 
    public static void main(String args[]){ 
     Stack stack =new Stack(); 

     String input; 

     String trimmedInput[]; 
     int output; 
     int number1,number2; 
     int countOfNumber,j; 

     Scanner scanner = new Scanner(System.in); 

     System.out.println("put your arithmetical expression. Using Space between "); 
     input=scanner.nextLine(); 

     trimmedInput=input.split("\\s+"); 

//  for(String a:trimmedInput) 
//   System.out.println(a); 


     countOfNumber=trimmedInput.length; 


     for(j=0;j<countOfNumber;j++) { 

       if (isNumeric(trimmedInput[j])) { 
        stack.push(trimmedInput[j]); 

       } 
       if (trimmedInput[j].equals("+")) { 
        number1 = Integer.parseInt((String) stack.pop()) ; 

        number2 = Integer.parseInt((String) stack.pop()) ; 

        output = number1 + number2; 

        stack.push(output); 

       } 

       if(trimmedInput[j].equals("-")){ 
        number1 = Integer.parseInt((String) stack.pop()) ; 

        number2 = Integer.parseInt((String) stack.pop()) ; 

        output = number1-number2; 

        stack.push(output); 
       } 
       if(trimmedInput[j].equals("*")){ 
        number1 = Integer.parseInt((String) stack.pop()) ; 

        number2 = Integer.parseInt((String) stack.pop()) ; 

        output = number1*number2; 

        stack.push(output); 
       } 
       if(trimmedInput[j].equals("/")){ 
        number1 = Integer.parseInt((String) stack.pop()) ; 

        number2 = Integer.parseInt((String) stack.pop()) ; 

        output = number1/number2; 

        stack.push(output); 
       } 

      } 

     while(!stack.isEmpty()) 
      System.out.println(stack.pop()); 


    } 
    public static boolean isNumeric(String str) 
    { 
     try 
     { 
      double d = Double.parseDouble(str); 
     } 
     catch(NumberFormatException nfe) 
     { 
      return false; 
     } 
     return true; 
    } 

} 

Ok. Hier ist mein Problem. Wenn ich * + * + 1 2 + 3 4 5 6, so etwas berechnen wollen, gibt mein Compiler einen Fehler wie folgt aus:

Exception in thread "main" java.util.EmptyStackException  
at java.util.Stack.peek(Stack.java:102)  
at java.util.Stack.pop(Stack.java:84) 
at Main.main(Main.java:41) 

Hier ist meine 41. Zeile an Code:

number1 = Integer.parseInt((String) stack.pop()) ; 

ich nicht dachte, können Sie heraus, was in Problem ist mein Code. Ich bin neu bei Java. Bitte hilf mir. Vielen Dank :)

+1

Dies bedeutet, dass Sie Elemente versuchen, auch aus Stapel zu nehmen, obwohl es ist leer! –

+2

Sie sollten von rechts nach links fahren. Werfen Sie einen Blick auf dieses Beispiel der Präfix-Auswertung: http://www.manojagarwal.co.in/evaluation-of-prefix-expression/ – rafid059

+0

Ja mein Freund. Ich weiß es aber ich kann nicht verstehen, dass mein Code diesen Fehler gibt. Ich schiebe meinen Stack in meinen Code. – cilgin282

Antwort

1

Ihr Code gibt Ihnen einen Fehler, weil Sie von links nach rechts analysieren. Also die erste Zeichenfolge, die es bekommt, ist "*" - Stern. Also, es überprüft, dass es ein Stern ist, und springt vom Stapel. Aber der Stapel ist leer !! Also, sollten Sie von rechts nach links überqueren und wenn Sie die Nummer Push in den Stack finden, und wenn Sie einen Operator finden, machen den Betrieb

for (int i = trimmedInput.length-1; i >= 0; i--) { 
    if (isNumeric(trimmedInput[i])) stack.push(trimmedInput[i]); 

    else if (trimmedInput[i].equals("*")) { 
     // here you might get StackEmptyException if your expression is invalid 
     // if you want to avoid that, then use try-catch and throw your custom InvalidExpressionExceptiono 
     number1 = Integer.parseInt((String)stack.pop()); 
     number2 = Integer.parseInt((String)stack.pop()); 
     output = number1*number2; 
     stack.push(output); 
    } 
    . 
    . 
    . // do the same for other operators 
    . 
    . 
} 
0

aktualisiert Antwort

Sollten Sie nicht schieben alle Betreiber in den Stapel, und es springt heraus, nachdem Sie zwei Operanden sehen? (Sie werden zwei Operanden haben, wenn einer an der Spitze des Stapels ist, und der andere kommt gerade herein, d. H. trimmedInput[j]).

+0

** sieht die erste trimmedInput [0] als *, es schiebt es in den Stapel ** . Dies passiert nie, weil der erste Stern (*) niemals in den Stapel geschoben wird. Überprüfen Sie die if-Bedingungen von OP. Der erste prüft, ob der String eine Zahl ist oder nicht. Die Ausnahme tritt auf, weil das Programm versucht, 2 Zahlen zu knacken, und sich im Stapel nichts befindet. Bediener werden nie in diesem Programm in den Stapel geschoben, und aus gutem Grund – rafid059

+0

Sie haben Recht. Ich folgte der Logik in meinem Kopf und ich habe es falsch verstanden. Ich habe meine Antwort oben aktualisiert. Entschuldigung für die Verwirrung. – leeyuiwah

+0

Das würde auch nicht funktionieren. Sie können das Beispiel von OP nachvollziehen und sehen, dass der einzige Weg, das Präfix auszuwerten, darin besteht, von rechts nach links zu traversieren. Außerdem sollten Sie keine Bediener auf den Stapel schieben. Sehen Sie sich die [Präfix-Auswertung] an (https://en.wikipedia.org/wiki/Polish_notation) :) – rafid059