以下代码适用于使用逆波兰表示法(3 4 +-> 7)的简单计算器
理论上,如果将字符串“ what”设置为“ 3 4 +”,则应返回7。 但是,当我运行它时,它什么也不会返回。
如果String设置为“ 3 4”,则返回4,而不是错误。
如果我有Evaluate(“ 3 4 +”),该方法将卡在最后一个catch块上。
欢迎任何帮助!
计算器是一个接口:
public abstract interface Calculator {
public abstract float evaluate(String what)
throws InvalidExpression, EmptyStack;
}
这是我遇到问题的课程:
public class RevPolishCalc implements Calculator {
/*
* NumStack is a facade, basically an ArrayList
*/
private NumStack values = new NumStack();
float answer;
public float evaluate(String what) throws InvalidExpression, EmptyStack {
if((what == null) || (what.equals(""))) {
throw new InvalidExpression("String is either empty or null");
}
try {
Scanner input = new Scanner(what);
while(input.hasNext()) {
if(input.hasNextFloat()) {
values.push(input.nextFloat());
} else {
String next = input.next();
//Symbol is an enum {PLUS, MINUS, TIMES, DIVIDE, INVALID}
Symbol nextSymbol;
if(next == "+") {
nextSymbol = Symbol.PLUS;
} else if (next == "-") {
nextSymbol = Symbol.MINUS;
} else if (next == "*") {
nextSymbol = Symbol.TIMES;
} else if(next == "/") {
nextSymbol = Symbol.DIVIDE;
} else {
nextSymbol = Symbol.INVALID;
}
switch(nextSymbol) {
case PLUS:
values.push(values.pop() + values.pop());
case MINUS:
values.push(-values.pop() + values.pop());
case TIMES:
values.push(values.pop() * values.pop());
case DIVIDE:
values.push(values.pop() / values.pop());
case INVALID:
throw new InvalidExpression("Invalid Value");
default:
throw new InvalidExpression("Unknown Value");
}
}
}
input.close();
answer = values.pop();
} catch (InvalidExpression e) {
throw new InvalidExpression("");
}
return answer;
}
}
答案 0 :(得分:1)
您的代码有几个问题:
在您的代码中,我们可以看到您使用==
来比较String
,例如:
if(next == "+") {
nextSymbol = Symbol.PLUS;
} else if ...
您shouldn't really do that。请改用equals
:
if(next.equals("+")) {
nextSymbol = Symbol.PLUS;
} else if ...
或更佳-只需使用if-else
语句,而不是一堆equals
和switch
调用!
switch(next) {
case "+":
nextSymbol = Symbol.PLUS;
break;
case "-":
nextSymbol = Symbol.MINUS;
break;
case "*":
nextSymbol = Symbol.TIMES;
break;
case "/":
nextSymbol = Symbol.DIVIDE;
break;
default:
nextSymbol = Symbol.INVALID;
break;
}
switch
语句:让我们看一下您对下一个Symbol
的处理方式:
switch(nextSymbol) {
case PLUS:
values.push(values.pop() + values.pop());
case MINUS:
values.push(-values.pop() + values.pop());
case TIMES:
values.push(values.pop() * values.pop());
case DIVIDE:
values.push(values.pop() / values.pop());
case INVALID:
throw new InvalidExpression("Invalid Value");
default:
throw new InvalidExpression("Unknown Value");
}
它将无法正常工作,因为在每个break
之后,您缺少关键的case
通话。只需像这样添加它们:
switch(nextSymbol) {
case PLUS:
values.push(values.pop() + values.pop());
break;
case MINUS:
values.push(-values.pop() + values.pop());
break;
case TIMES:
values.push(values.pop() * values.pop());
break;
case DIVIDE:
values.push(values.pop() / values.pop());
break;
case INVALID:
throw new InvalidExpression("Invalid Value");
default:
throw new InvalidExpression("Unknown Value");
}
您的方法将按预期工作。
答案 1 :(得分:0)
比较字符串时,请使用
if(next.equals("+")) {
nextSymbol = Symbol.PLUS;
} else if (next.equals("-")) {
nextSymbol = Symbol.MINUS;
} else if (next.equals("*")) {
nextSymbol = Symbol.TIMES;
} else if(next.equals("/")) {
nextSymbol = Symbol.DIVIDE;
} else {
nextSymbol = Symbol.INVALID;
}