我的主要方法要求用户输入表达式,输入内容将类似于“ 5 4 +”或“ 6 4 + 8 /”,操作数和运算符之间用空格分隔。我有一种方法可以处理此输入,并给出等于它的答案。它循环遍历通过while循环输入的所有数字,该循环在scnr.hasNext() == true或errorMessage不为null时结束。当前,scnr.hasNext()变得比其应有的假更快,导致循环仅读取第一个数字,然后结束。因为我尝试将scnr.nextInt()存储到变量中,所以它变得错误。我需要它仅取第一个数字,其余的保留,我认为这将保持scnr.hasNext()为真。这是我的整个方法

public static Number evaluateExpression(String expr) {
        int var = 0;
        String input = "";

        String tooFewOperands = "Too few operands";
        String unKnownOperator = "Unknown operator:";
        String tooManyOperands = "Too many operands.";

        Stack<Integer> stack = new Stack<>();
        String errMsg = null;

        Scanner scnr = new Scanner(expr);

        while (scnr.hasNext() && errMsg == null) {
            if (scnr.hasNextInt()) {
                var = scnr.nextInt();                           //Problematic line
                System.out.println("Operand read: " + var);
                stack.push(var);
            } else {
                input = scnr.next();
                if (checkValidOperator(input) == input.toCharArray()[0]) {
                    System.out.println("Operator read: " + input);
//                    stack.push(var);
                    if (stack.size() >= 2) {
                        execute(stack, input.toCharArray()[0]);
                    } else {
                        errMsg = tooFewOperands;
                    }
                } else {
                    errMsg = unKnownOperator + " " + input + " ";
                }
            }
            System.out.println("------ Stack state -----");
            System.out.println(stack.toString());
            System.out.println(scnr.hasNext());
        }
        if (errMsg != null) {
            System.out.println("Failed evaluation of |" + expr + "|\n" + errMsg);
            return null;
        }
        if (stack.size() > 1) {
            System.out.println("Failed evaluation of |" + expr + "|\n" + tooManyOperands + stack.toString());
            return null;
        } else {
            return stack.peek();
        }
    }


注意,Scanner scnr是用String expr初始化的,我想我的老师暗示这允许我从scnr读取单个标记。她说:“使用expr作为其构造函数的参数来初始化扫描程序,这将使您可以从表达式中读取令牌。”除了System.in以外,我从未初始化过Scanner。她还指定要使用此方法,我应该“编写一个循环,只要扫描程序输入(hasNext)并且错误消息为null,该循环就会运行。”这就是while条件必须具备的条件。

最佳答案

通常,为字符串类型和数字类型同时创建Scanner对象时,它会发生(或者至少发生在我身上)。

我所做的是改为使用var = Integer.parseInt(scnr.nextLine());

希望对您有帮助。

10-05 22:23