2016-03-19 6 views
0

Ich habe an einer Schulaufgabe gearbeitet, die uns eine Zeichenfolge von Infix-Notation in Postfix-Notation konvertieren muss. Wir müssen dies tun, indem wir einen Stapel verwenden, der ein Array implementiert.Programm Konvertieren von Infix zu Postfix-Notation

Hier ist mein Code für die tatsächliche Umwandlung Klasse: Paketpraxis;

public class Praxis {

public static String infixToPostfix(String infix) 
{ 

    Practice2 operatorStack = new Practice2(); 
    String output = ""; 
    char curChar; 
    String input = infix; 
    boolean isOperator=false; 
    boolean empty=true; 
    int curCharPrecedence=0; 
    int topOfStackPrecedence=0; 

    for(int i =0; i<input.length();i++){ 

     curChar = input.charAt(i); 

     switch(curChar){ 
     case '+': isOperator=true; 
     case '-': isOperator=true; 
     case '/': isOperator=true; 
     case '*': isOperator=true; 
     case '(': isOperator=true; 
     case ')': isOperator=true; 
        break; 
     default: isOperator=false; 
     } 

     if(!isOperator){ 
      output=output+curChar; 
     } 

     else if(isOperator){ 
     output+=" "; 

      if(empty){ 
       empty=false; 
       operatorStack.Push(curChar); 
      } 


      else if(!operatorStack.empty()){ 
       switch(curChar){ 
       case ')': topOfStackPrecedence=0; 
       case '+': curCharPrecedence=1; 
       case '-': curCharPrecedence=1; 
       case '/': curCharPrecedence=2; 
       case '*': curCharPrecedence=2; 
       case '(': topOfStackPrecedence=3; 
       } 

       switch((Character) operatorStack.peek()){ 
       case ')': topOfStackPrecedence=0; 
       case '+': topOfStackPrecedence=1; 
       case '-': topOfStackPrecedence=1; 
       case '/': topOfStackPrecedence=2; 
       case '*': topOfStackPrecedence=2; 
       case '(': topOfStackPrecedence=3; 
       } 


       if(curCharPrecedence>topOfStackPrecedence){ 
        operatorStack.Push(curChar); 

       } 
       else{ 

        while(!operatorStack.empty()&&topOfStackPrecedence>curCharPrecedence){ 


         output+= operatorStack.pop(); 
         output+=" "; 

         if(!operatorStack.empty()) 
         switch((Character) operatorStack.peek()){ 
         case ')': topOfStackPrecedence=0; 
         case '+': topOfStackPrecedence=1; 
         case '-': topOfStackPrecedence=1; 
         case '/': topOfStackPrecedence=2; 
         case '*': topOfStackPrecedence=2; 
         case '(': topOfStackPrecedence=3; 
         } 

        } 
         operatorStack.Push(curChar); 
       } 





       } 
      } 

     } 
    while(!operatorStack.empty()){ 
      output+=" "; 
      output+= operatorStack.pop(); 
     } 

    return output; 
} 

public static void main(String[] args) 
{ 
    System.out.println(infixToPostfix("a+b*c")); 
} 

}

hier Dann ist mein Code für die Stapelklasse:

package practice; 

import java.util.EmptyStackException; 



public class Practice2<T> extends Object{ 

public T[] stack = (T[]) new Object[10]; 

    int topOfStack =-1; 

    public Practice2() 
    { 
     stack = (T[]) new Object[10]; 
    } 
    public Practice2(int capacity) 
    { 
     stack = (T[]) new Object[capacity]; 
    } 

    public T Push(Object item) 
    { 
     if(topOfStack<=stack.length-1){ 
      T[] temporary = (T[]) new Object[stack.length]; 

      for(int i=0; i<stack.length-1;i++){ 
       temporary[i]=stack[i]; 

      } 
      stack = (T[]) new Object[temporary.length+10]; 
      for(int i=0; i<temporary.length-1;i++){ 
       stack[i]=temporary[i]; 
      } 

     } 

     topOfStack++; 
     stack[topOfStack]= (T) item; 


     return (T) item; 

    } 

    public T peek() 
    { 

     return stack[topOfStack]; 


    } 

    public T pop() 
    { 
     if(topOfStack==-1){ 
      throw new EmptyStackException(); 
     } 
     else 
      return stack[topOfStack--]; 

    } 

    public boolean empty() 
    { 
     if(topOfStack==-1) 
      return true; 
     else 
      return false; 
    } 

    public int size(){ 
     return topOfStack+1; 
    } 



} 

Jedes Mal, wenn ich versuche, das ich die folgende Fehlermeldung auszuführen:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
    at practice.Practice2.peek(Practice2.java:49) 
    at practice.Practice.infixToPostfix(Practice.java:53) 
    at practice.Practice.main(Practice.java:106 

Es scheint, dass das Problem meine Peek-Methode in der Stack-Klasse ist, aber ich bin mir nicht ganz sicher.

Jede Hilfe wird sehr geschätzt, ich habe viel zu viel Zeit in diesem Programm verbracht und brauche dringend jemand anderen, um es sich anzusehen.

+0

Sie nicht brauchen, um dieses ... ** Klasse Praxis2 erstreckt Objekt ** zu tun, jedes Objekt erstreckt das Objekt cl Arsch standardmäßig ... –

+0

@Xoce 웃 Пepeúpa hey danke für den Kommentar, nur das behoben. – skulltula

Antwort

1

Der Fehler ist ganz klar ArrayIndexOutOfBoundsException ....

und der Grund ist hier:

switch((Character) operatorStack.peek()){ 

Sie vor einer Push einen Blick tun ... präziser: Sie zu bekommen versuchen, das Element des Arrays an der befindet topOfStack = -1 und das ist der Grund für die Ausnahme ...

+0

Ja, ich habe das gerade herausgefunden und meine else if-Anweisung vor der switch-Anweisung geändert, um das zu beheben. Mein Programm kompiliert jetzt, gibt aber nicht die korrekte Ausgabe. Für die Zeichenfolge "a + b * c" bekomme ich ein b + c * als Lösung, wenn es ein b c * + sein sollte – skulltula