Postfix Evaluator - PullRequest
       73

Postfix Evaluator

0 голосов
/ 22 сентября 2019

Я хочу создать Postfix Evaluator, который работает с многозначными и десятичными числами.Программа работает с многозначными числами, но не с десятичными.Как я могу это сделать?Я использовал инфиксное выражение: «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 голосов
/ 22 сентября 2019

Есть несколько способов сделать это.Что вам нужно сделать, так это найти символ '.' и запустить некоторый процесс деления на степени десяти, как только вы найдете десятичную точку.Следующий способ должен работать, и все деления выполняются за один шаг, уменьшая ошибку округления:

        } 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...
...