我需要使計算器採取中綴表達式並使用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。 – Henry
由此,我的意思是我使用分流碼原則將中綴轉換爲後綴,然後對其進行評估,因此:採用arg1,採用arg2並執行操作。 – laszlo