2015-03-03 2 views
1

Так что я делаю программу, которая оценивает постфиксное выражение из файла. Однако я продолжаю получать сообщение об ошибке:Оценка Postfix с помощью ошибки стеков (java)

0 
Exception in thread "main" java.lang.NumberFormatException: For input string: "+" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:484) 
    at java.lang.Integer.valueOf(Integer.java:582) 
    at postfixEvaluater.postfixEvaluation(postfixEvaluater.java:89) 
    at postfixEvaluater.readFromTheFile(postfixEvaluater.java:49) 
    at postfixEvaluater.main(postfixEvaluater.java:21) 

содержимое входного файла .txt следующим образом:

511+93/2-932/-149657%/*-+14+96*5/7%-149-+6*57%/ 

и ожидаемый результат:

5 
2 
1 
8 
-4 
2 
-4 

Вот весь мой код до сих пор:

import java.util.Scanner; 
import java.io.File; 
import java.io.FileNotFoundException; 

public class postfixEvaluater { 
    public static void main(String[] commandlineArguments) { 
     //Error Checking 
     if(commandlineArguments.length == 0){ 
     System.out.println("Please enter the file name."); 
     } 
     else{ 
     postfixEvaluater.readFromTheFile(commandlineArguments[0]); 
     } 

    }   


    public static void readFromTheFile(String fileName) { 
     //connect to file 
     File file = new File(fileName); 
     Scanner scanFile = null; 
     try { 
     scanFile = new Scanner(file); 
     } 
     catch (FileNotFoundException exception) { 

     System.out.print("File not found for " + fileName); 

     System.exit(1); 
     }   

     while (scanFile.hasNextLine()) { 

     String line = scanFile.nextLine(); 

     Integer postfixLine = postfixEvaluater.postfixEvaluation(line); 
     System.out.println(postfixLine); 



     } 
    } 


    public static Integer postfixEvaluation(String input){ 




     StackInterface<Integer> stack = new LinkedStack<Integer>(); 

     Integer result = new Integer(0); 



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

     String characterNum = input.substring(i, i+1); 

     Integer integer1 = new Integer(0); 
     Integer integer2 = new Integer(0); 

     Integer character = (Integer.valueOf(characterNum)); 



     if (character.equals("0")) { 
      stack.push(character); 

     } 
     else if (character.equals("1")) { 
      stack.push(character); 

     } 
     else if (character.equals("2")) { 
      stack.push(character); 
     } 
     else if (character.equals("3")) { 
      stack.push(character); 
     } 
     else if (character.equals("4")) { 
      stack.push(character); 
     } 
     else if (character.equals("5")) { 
      stack.push(character); 
     } 
     else if (character.equals("6")) { 
      stack.push(character); 
     } 
     else if (character.equals("7")) { 
      stack.push(character); 
     } 
     else if (character.equals("8")) { 
      stack.push(character); 
     } 
     else if (character.equals("9")) { 
      stack.push(character); 
     } 
     else if (character.equals("*")) { 
      integer2 = stack.pop(); 
      integer1 = stack.pop(); 


      result = integer1 * integer2; 


      stack.push(result); 



     } 
     else if (character.equals("/")) { 
      integer2 = stack.pop(); 
      integer1 = stack.pop(); 

      result = integer1/integer2; 


      stack.push(result); 

     } 
     else if (character.equals("%")) { 
      integer2 = stack.pop(); 
      integer1 = stack.pop(); 


      result = integer1 % integer2; 


      stack.push(result); 
      } 
     else if (character.equals("+")) { 
      integer2 = stack.pop(); 
      integer1 = stack.pop(); 


      result = integer1 + integer2; 


      stack.push(result); 

     } 
     else if (character.equals("-")) { 
      integer2 = stack.pop(); 
      integer1 = stack.pop(); 

      result = integer1 - integer2; 


      stack.push(result); 

     } 


     } 
     return result; 
    } 
} 

Вот часть моего кода, где я чувствую, что проблема остается (кстати, я толкаю и ничего не пишу, кроме целых):

public static Integer postfixEvaluation(String input){ 




     StackInterface<Integer> stack = new LinkedStack<Integer>(); 

     Integer result = new Integer(0); 



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

     String characterNum = input.substring(i, i+1); 

     Integer integer1 = new Integer(0); 
     Integer integer2 = new Integer(0); 

     Integer character = (Integer.valueOf(characterNum)); 



     if (character.equals("0")) { 
      stack.push(character); 

     } 
     else if (character.equals("1")) { 
      stack.push(character); 

     } 
     else if (character.equals("2")) { 
      stack.push(character); 
     } 
     else if (character.equals("3")) { 
      stack.push(character); 
     } 
     else if (character.equals("4")) { 
      stack.push(character); 
     } 
     else if (character.equals("5")) { 
      stack.push(character); 
     } 
     else if (character.equals("6")) { 
      stack.push(character); 
     } 
     else if (character.equals("7")) { 
      stack.push(character); 
     } 
     else if (character.equals("8")) { 
      stack.push(character); 
     } 
     else if (character.equals("9")) { 
      stack.push(character); 
     } 
     else if (character.equals("*")) { 
      integer2 = stack.pop(); 
      integer1 = stack.pop(); 


      result = integer1 * integer2; 


      stack.push(result); 



     } 
     else if (character.equals("/")) { 
      integer2 = stack.pop(); 
      integer1 = stack.pop(); 

      result = integer1/integer2; 


      stack.push(result); 

     } 
     else if (character.equals("%")) { 
      integer2 = stack.pop(); 
      integer1 = stack.pop(); 


      result = integer1 % integer2; 


      stack.push(result); 
      } 
     else if (character.equals("+")) { 
      integer2 = stack.pop(); 
      integer1 = stack.pop(); 


      result = integer1 + integer2; 


      stack.push(result); 

     } 
     else if (character.equals("-")) { 
      integer2 = stack.pop(); 
      integer1 = stack.pop(); 

      result = integer1 - integer2; 


      stack.push(result); 

     } 


     } 
     return result; 
    } 
+2

Исключение довольно ясное. В вашем методе postfixEvaluation вы пытаетесь преобразовать знак «+» в int – DeiAndrei

+0

@DeiAndrei. Итак, все операторы должны быть строками? – CMcorpse

+1

Операнды - это ints (или любой числовой тип), но операторы (+ - * /) - нет. – DeiAndrei

ответ

1

Ваша задача заключается в следующей строке коды:

Integer character = (Integer.valueOf(characterNum)); 

Поскольку вы пытаетесь преобразовать любой символ в число и ваша строка также содержат операторы (которые не могут быть преобразованы в число), вы получаете исключение.

Вы, вероятно, следует думать об этом таким образом:

  • мой характер цифра?

    Да => преобразовать его номер и нажать ее в стек

    Нет => это операнд, поэтому поп-2 верхних элементов из стека, выполнить операцию и нажмите результат.

+0

Итак, символ должен быть оставлен как String characternum, а в операторах if и if else для цифр преобразовать его в целое число? – CMcorpse

+0

Ах. выдумал, большое спасибо. – CMcorpse