2015-03-03 70 views
1

所以我正在制作一个程序来评估文件中的后缀表达式。但我不断收到错误:使用堆栈错误的后缀评估(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 2015-03-03 07:50:15

+0

@DeiAndrei所以所有的操作符都应该是Strings? – CMcorpse 2015-03-03 07:51:46

+1

操作数是整数(或任何数字类型),但运算符(+ - * /)不是。 – DeiAndrei 2015-03-03 07:53:22

回答

1

您的问题是下面的代码行:

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

既然你想任何字符转换为数字和您的字符串也包含运营商(不能转换为数字),你会得到一个例外。

你或许应该考虑一下这种方式:

  • 是我的性格是数字吗?

    是=>将其转换为数字,并将它推栈

    否=>这是一个操作数上,因此弹出从堆栈顶部2的元素,执行该操作和推的结果。

+0

所以字符只是作为字符串characternum,并在数字的if和if else语句中,将其转换为整数呢? – CMcorpse 2015-03-03 08:02:38

+0

啊。想通了,非常感谢。 – CMcorpse 2015-03-03 08:08:52