我想创建一个可以处理多位数和十进制数字的Postfix评估程序。该程序可以使用多位数,但不能使用小数。我该怎么做?我使用了中缀表达式:“ 10 + 20 *(50/3)+ 4”,在后缀中是“ 10 20 50 3 / * + 4 +”。结果,我得到了347.33333333333337,这是正确的。我只需要计算器使用十进制数字即可。
public class EvaluarExpresion {
public static double evaluaExpresion (String postfija) {
MyStack<Double> stack = new MyStack<Double>();
//String postfija= expresionPostFijo();
for(int i = 0; i < postfija.length(); i++) {
char c = postfija.charAt(i);
if(c == ' ') {
continue;
}else if(Character.isDigit(c) || c == '.') {
int n = 0;
int divider =1;
boolean hasDecimal = false;
while(Character.isDigit(c) || c == '.') {
if(c == '.') {
hasDecimal = true;
} else {
if(hasDecimal) {
divider *=10;
}
n = n*10 + (int)(c-'0');
c = postfija.charAt(i);
}
i++;
}
i--;
stack.push((double) n);
} else {
Double val1 = stack.pop();
Double val2 = stack.pop();
switch(c)
{
case '+':
stack.push(val2+val1);
break;
case '-':
stack.push(val2- val1);
break;
case '/':
stack.push(val2/val1);
break;
case '*':
stack.push(val2*val1);
break;
case '^':
stack.push(Math.pow(val2, val1));
break;
}
}
}
return stack.pop();
}
public static void main(String[] args) {
// This is an example of an infix expression String dato = "10 + 20 * ( 50 / 3 ) + 4";
//The expression provided below is a postfix expression
System.out.println(evaluaExpresion("10 20 50 3 / * + 4 +"));
//The result is 347.33333333333337 which is correct
}
}
答案 0 :(得分:0)
有多种方法可以完成此操作。您需要做的是查找'.
'字符,找到小数点后开始进行除以10的幂的过程。以下方法应该可行,并且一步一步完成所有划分,从而减少舍入误差:
} else if (Character.isDigit(c) || c == '.') {
int n = 0;
int divider = 1;
boolean hasDecimal = false;
while (Character.isDigit(c) || c == '.') {
if (c == '.') {
hasDecimal = true;
} else {
if (hasDecimal) {
divider *= 10;
}
n = n * 10 + (int) (c - '0');
c = postfija.charAt(i);
}
i++;
}
i--;
stack.push((double) n / divider);
} else { // etc...