【发布时间】:2017-03-20 13:08:12
【问题描述】:
我需要制作一个接受中缀表达式并使用 rpn 来计算它的计算器。
Java 代码:
public RpnCalculator() {
}
public float eval(float arg1, float arg2, String operator) {
switch (operator) {
case PLUS:
return arg1 + arg2;
case MINUS:
return arg2 - arg1;
case MULTIPLICATION:
return arg1 * arg2;
case DIVISION:
return arg2 / arg1;
default:
return 0;
}
}
public String evaluateInfixExpression(String expression) {
Stack<String> operators = new Stack<>();
String[] args = expression.split(SPACE);
Stack<String> values = new Stack<>();
for (String arg : args) {
if (isANumber(arg)) {
values.push(arg);
continue;
}
if (operators.isEmpty()) {
operators.push(arg);
} else if (precedence(arg) <= precedence(operators.peek())) {
float result = eval(Float.parseFloat(values.pop()), Float.parseFloat(values.pop()), operators.pop());
values.push(String.valueOf(result));
operators.push(arg);
} else if (precedence(arg) > precedence(operators.peek())) {
operators.push(arg);
}
}
while (!operators.isEmpty()) {
float result = eval(Float.parseFloat(values.pop()), Float.parseFloat(values.pop()), operators.pop());
values.push(String.valueOf(result));
}
return expression;
}
public int precedence(String operator){
if (operator.equals(PLUS) || operator.equals(MINUS)){
return 1;
}
return 2;
}
public boolean isANumber(String number) {
if (number.matches("-?\\d+")) {
return true;
}
return false;
}
}
而且效果很好,只是有时会给出错误的答案... 在我看来,我正在遵循调车场算法原则,但正如你所见,我实际上并没有将中缀转换为后缀,但我尝试在旅途中评估参数,这可能是个问题。
例如表达式 -2 + 6 * 8 / 3 * 18 - 33 / 3 - 11 的计算结果为 286 而不是 264。应该有一些我无法注意到的错误,已经两天了,所以请帮我。此外,我在堆栈上阅读了很多关于 RPN 的线程,但似乎每个人都有不同的问题,所以我没有为我的案例找到答案。
谢谢。
【问题讨论】:
-
“使用 rpn 评估它”是什么意思。在您的程序中,您不使用 RPN。
-
我的意思是我使用分流场原则将中缀转换为后缀,然后对其进行评估,因此:取arg1,取arg2并进行操作。
标签: java calculator rpn