我的主要方法要求用户输入表达式,输入内容类似于“ 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());
。
希望它对您有帮助。
我看不到您的Scanner
代码的结构有什么问题。