【问题标题】:Why am I getting error calculating postfix last operator?为什么我在计算后缀最后一个运算符时出错?
【发布时间】:2016-06-07 17:05:25
【问题描述】:

该项目要求使用 Stack 来计算后缀表达式,特别是这个:

5.0 3.5 - 1.2 /

现在我的代码对于这个后缀表达式可以正常工作:

2 3 +

我错过了什么导致我出现以下错误?

线程“主”java.lang.NumberFormatException 中的异常:空 字符串
在 sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842) 在 sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110) 在 java.lang.Double.parseDouble(Double.java:538) 在 java.lang.Double.(Double.java:608) 在 project.Calculator.processIn(Calculator.java:55) 在 project.Project_main.main(Project_main.java:25) Java 结果:1

package project;

import java.util.ArrayList;
import java.util.Stack;



public class Calculator {
    Stack<Double> calcStack = new Stack<>();
    ArrayList<String> operators = new ArrayList<>();

    public Calculator() {
        operators.add("+");
        operators.add("-");
        operators.add("/");
        operators.add("*");
    }

    public double processIn(String expression){
        String[] express = expression.split("");

        String temp = "";
        for(String j : express){
            if(operators.contains(j)){
                System.out.println("Operator Reached: " + j);
                double operand2 = calcStack.pop();
                double operand1 = calcStack.pop();

                double tmp = 0.0;
                if(j.compareTo("*") == 0){
                    tmp = operand1 * operand2;
                    System.out.println("Performing multiplication on " + operand1 + " and " + operand2);
                    calcStack.push(tmp);
                }
                else if(j.compareTo("/") == 0){
                    tmp = operand1 / operand2;
                    System.out.println("Performing division on " + operand1 + " and " + operand2);
                    calcStack.push(tmp);
                }
                else if(j.compareTo("-") == 0){
                    tmp = operand1 - operand2;
                    System.out.println("Performing subtraction on " + operand1 + " and " + operand2);
                    calcStack.push(tmp);
                }
                else if(j.compareTo("+") == 0){
                    tmp = operand1 + operand2;
                    System.out.println("Performing addition on " + operand1 + " and " + operand2);
                    calcStack.push(tmp);
                }
                System.out.println("Pushing result to stack: " + tmp);

            }
            else if(j.compareTo(" ") == 0){
                double newOperand = new Double(temp);
                temp = "";
                System.out.println("Pushing to stack: " + newOperand);
                calcStack.push(newOperand);
            }
            else{
                temp = temp + j;
                System.out.println("Current temp value: " + temp);
            }
        }
        return calcStack.pop();
    }
}

【问题讨论】:

  • 你班上的第 55 行是什么?
  • double newOperand = new Double(temp);
  • 当它碰到“”(空格)时会这样做

标签: java stack


【解决方案1】:

我认为这将解决您的问题。 用“”(空格)而不是“”分割

String[] express = expression.split(" ");

并将你的 else 更改为 bellow

else {
    double newOperand = new Double(j);
    System.out.println("Pushing to stack: " + newOperand);
    calcStack.push(newOperand);
}

如果出现以下情况则删除其他内容

else if(j.compareTo(" ") == 0){
    double newOperand = new Double(temp);
    temp = "";
    System.out.println("Pushing to stack: " + newOperand);
    calcStack.push(newOperand);
}

这样您就可以直接将数字添加到您的堆栈中。 您的错误是由于您在操作后处理空间的方式而发生的。当你有数字后跟数字时,首先调用 else ,然后调用 if 空间。所以你的临时值中有一个数字。但是在完成操作后,您会立即获得空间,但您的 temp 没有任何价值,因此 new Double(temp) 会引发异常,因为 temp 不是数字。 因此,如果您想保持代码不变,另一种修复代码的方法是使用 try 和 catch,如下所示。

else if(j.compareTo(" ") == 0){
    try{
    double newOperand = new Double(temp);
    temp = "";
    System.out.println("Pushing to stack: " + newOperand);
    calcStack.push(newOperand);
    }catch(NumberFormatException ex){
        //skip
    }
}

这样您就可以在不破坏代码的情况下发现错误。但我推荐第一个解决方案。

【讨论】:

  • 但是它怎么知道什么时候结束一个数字呢?比如5.0?
  • 好吧,每个数字和操作之间都有一个空格,所以当你用空格分割时,所有部分都是完整的。你将有一个数组 ["5.0", "3.5", "-", "1.2", "/"]
【解决方案2】:

请按照 Shawn 的建议,如 expression.split(" ") 那样在空格“”上拆分字符串(但这假设您的表达式总是在运算符和操作数之间包含空格)。这将为您提供两种类型的标记/字符串操作数和运算符。这是您的代码的更简化的实现。请注意expression.trim() 操作以避免任何尾随空格。

[顺便说一句,我已经在 eclipse 中尝试过,它可以工作:) ]

public double processIn(String expression)
{
    expression = expression.trim();
    System.out.println("Trimmed expressoin : " + expression);
    String[] express = expression.split(" ");

    for(String j : express){

        if(operators.contains(j)){
            System.out.println("Operator Reached: " + j);
            double operand2 = calcStack.pop();
            double operand1 = calcStack.pop();

            double tmp = 0.0;
            if(j.compareTo("*") == 0){
                tmp = operand1 * operand2;
                System.out.println("Performing multiplication on " + operand1 + " and " + operand2);
                calcStack.push(tmp);
            }
            else if(j.compareTo("/") == 0){
                tmp = operand1 / operand2;
                System.out.println("Performing division on " + operand1 + " and " + operand2);
                calcStack.push(tmp);
            }
            else if(j.compareTo("-") == 0){
                tmp = operand1 - operand2;
                System.out.println("Performing subtraction on " + operand1 + " and " + operand2);
                calcStack.push(tmp);
            }
            else if(j.compareTo("+") == 0){
                tmp = operand1 + operand2;
                System.out.println("Performing addition on " + operand1 + " and " + operand2);
                calcStack.push(tmp);
            }
            System.out.println("Pushing result to stack: " + tmp);

        }
        else {

            double newOperand = new Double(j);
            System.out.println("Pushing operand to stack: " + newOperand);
            calcStack.push(newOperand);
        }
    }
    return calcStack.pop();
}

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 2014-11-18
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多