后缀评估器

时间:2019-09-22 16:21:55

标签: java data-structures postfix-notation infix-notation

我想创建一个可以处理多位数和十进制数字的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


    }
}

1 个答案:

答案 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...