当前位置: 首页 > 知识库问答 >
问题:

为什么我在计算后缀最后一个运算符时出错了?

党浩阔
2023-03-14

2 3+

我错过了什么,导致了下面的错误?

线程“main”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:538)位于Java.lang.Double.(Double.Java:608)位于

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

共有1个答案

巩阳秋
2023-03-14

我想这会解决你的问题。用“”(空格)而不是“”拆分

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

然后把你的另一个改变成咆哮

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

如果大声喊话,则删除else

else if(j.compareTo(" ") == 0){
    double newOperand = new Double(temp);
    temp = "";
    System.out.println("Pushing to stack: " + newOperand);
    calcStack.push(newOperand);
}
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
    }
}
 类似资料:
  • 题3-3 后缀式计算 题目描述 输入一个后缀表达式,试计算该表达式的结果。 规定:后缀表达式的长度不超过一行(80个字符),以$作为输入结束,操作数、操作符之间用空格分隔,操作符只可能有+、-、*、/四种运算,操作数均为整数且运算过程不超出int型范围。例如:234 34 + 2 * $。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据在一行上输入不超过80个字符的合法的后缀表达式,数据之

  • 我使用以下逻辑实现中缀到后缀的转换,以便稍后对其进行评估。 > 在中缀转换上循环,并在每次迭代中执行以下操作: 如果是空格,请忽略它 注意:当我遇到或时,我可以确定它是二进制还是一元操作符。如果它是二进制的,我将它添加到堆栈中作为'或,但是如果它是一进制的,我将它添加为'@'或'$'。 该算法运行良好,除非两个一元运算符相邻。 例如,变成了,这是错误的。 怎么了?这个问题的正确解决方案是什么,不会

  • 问题内容: 我在计算本月下一个最后一天何时发送预定的通知时遇到问题。 这是我的代码: 这是导致问题的线,我相信: 如何使用日历正确设置下个月的通知的最后一天? 问题答案: 这将返回当前月份的实际最大值。例如,现在是leap年的2月,因此它返回29作为。

  • 我做了一个小系统,它需要一个座位数来填满电影院一定数量的座位(没有排)。现在我做了一个填充座位并返回地图的方法,地图返回在什么位置有一定数量的座位是空闲的(例如3-2意味着从位置3开始有两个相邻的座位)。 这很有效,但如果我说最多有5个座位,而座位5是免费的,那么该方法不会将其返回到地图。 以下是使用的代码: 对象座椅 此方法创建一个LinkedList,并通过giveRandomAvailabi

  • 问题内容: 从下面或此处的程序中,为什么最后一次调用要打印该值7? 问题答案: 这将打印出“ 6”,因为它将i加1并返回值。5 + 1 = 6;这是前缀,在操作中使用该编号之前会添加该编号。 这将打印出“ 6”,因为它需要i,存储副本,加1并返回副本。因此,你获得了我当时的价值,但同时又增加了它。因此,你可以打印出旧值,但是它会增加。后缀增量的好处。 然后,当你打印出i时,它会显示i的实际值,因为

  • 这是一个理论上的问题: 我必须计算一个表达式,我已经从中缀转换到后缀。后缀保存在中,因为我希望避免使用。这样我就知道数字之间的除法在哪里,我可以按“正确”的顺序访问它。 它看起来是这样的: 现在我想用两个堆栈: null 如果我到达一个运算符,并且数量计数至少为2,我将执行该操作并将其推到目标堆栈上。到达原始堆栈的末尾(现在是空的),我会把所有的东西都传递给它,然后从头开始,直到只剩下结果。 我现