【问题标题】:Postfix evaluation using stacks error (java)使用堆栈错误的后缀评估(java)
【发布时间】:2015-05-03 18:54:12
【问题描述】:

所以我正在制作一个程序来评估文件中的后缀表达式。但是我不断收到错误:

 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;   
   }

【问题讨论】:

  • 异常很明显。在您的 postfixEvaluation 方法中,您正在尝试将“+”号转换为 int
  • @DeiAndrei 所以所有的操作符都应该是字符串?
  • 操作数是整数(或任何数字类型),但运算符 (+ - * /) 不是。
  • @DeiAndrei 嗯,我明白了。我会尝试为运营商制作一个新的字符串。
  • @DeiAndrei 谢谢。

标签: java stack postfix-notation


【解决方案1】:

您的问题是以下代码行:

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

由于您尝试将任何字符转换为数字,并且您的字符串还包含运算符(不能转换为数字),因此您会遇到异常。

你或许应该这样想:

  • 我的角色是数字吗?

    是 => 将其转换为数字并将其压入堆栈

    No => 它是一个操作数,因此从堆栈中弹出顶部 2 个元素,执行操作并推送结果。

【讨论】:

  • 那么character应该只保留为String characternum,而在if和if else语句中,将其转换为整数呢?
猜你喜欢
  • 2012-05-01
  • 2013-05-02
  • 1970-01-01
  • 2014-07-01
  • 2011-08-03
  • 1970-01-01
  • 2019-07-25
  • 2016-09-23
  • 2011-12-14
相关资源
最近更新 更多