我的主要方法要求用户输入表达式,输入内容将类似于“ 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());
。
希望对您有帮助。