Kalkulator onp java

0

itajcie, zachciałem sobie ostatnio napisać taki kalkulator ONP w Javie. Polega to na tym, że np. wyrażenie: 3+(2-5)*(4/2) zamienia na onp, czyli 3 2 5 - 4 2 / * +. Potem ma to zamienić na normalną wartość.

Pierwszą część kodu programu zrobiłem, czyli zamiana na onp działa w 100%, ale mam problem z drugą częścią, a mianowicie zamianą tego na końcową wartość. Działa mi ona dla niektórych wyrażeń(np. 2 2 * +), a dla innych nie (np. 3 2 5 - 4 2 / * +). Tak wygląda ta funkcja. Byłbym wdzięczny, jeśli chcielibyście mi pomóc :)

private static void calculate(String result) {
        Stack<Double> values = new Stack<>(); //stos
        String str = ""; //zmienna na poszczegolna liczbe, ktora bede kladl na stos
 
        for (int i = 0; i < result.length(); i++) {
            if(result.charAt(i) == ' '){
                if(result.charAt(i-1) != ' ' && result.charAt(i-1) != '+' &&//mogą być 2 spacje pod rząd
                   result.charAt(i-1) != '-' && result.charAt(i-1) != '*' && result.charAt(i-1) != '/'){
                    values.push(Double.parseDouble(str));
                    str = "";
                }
            }
            else if(result.charAt(i) == '+' || result.charAt(i) == '-' ||
                    result.charAt(i) == '*' || result.charAt(i) == '/'){
 
                if(result.charAt(i) == '-' && result.charAt(i+1) != ' ')
                    str += '-';
                else{
                    double a = values.pop();
                    double b = values.pop();
 
                    switch (result.charAt(i)){
                        case '+':
                            values.push(a+b);
                            break;
                        case '-':
                            values.push(a-b);
                            break;
                        case '*':
                            values.push(a*b);
                            break;
                        case '/':
                            values.push(a/b);
                            break;
                    }
                }
            }
            else {
                str += result.charAt(i);
            }
        }
 
        while(true){
            if(values.empty())
                break;
            else
                System.out.println(values.pop()); //tutaj taka proba wypisania na koncu
        }
    }
 
1

Ja bym zrobił tak:

private static double calculate(String result) {
        result = result.trim();
        Stack<Double> values = new Stack<>(); //stos
        String[] tokens = result.split(" +");
        double answer = 0.0;
 
        for (String token: tokens)
        {
             if(!isOperator(token))
             {
                 values.add(Double.parseDouble(token));
            }
           else
           {
                 double a = values.pop();
                 double b = values.pop();
                 switch(token)
                 {
                       case "+":
                           answer = a + b;
                           break;
                       ...             
                }
                values.add(answer); 
            }
        }
        return answer;
}

Poza tym masz złą kolejność argumentów w odejmowaniu i dzieleniu.

0

Wow , to można tak krótko? :D
Niedługo spróbuję , dzięki za odpowiedzi

0

Wspaniały pomysł, tylko kiedy dokańczam ten kod:

private static double calculate(String result) {
    result = result.trim();
    Stack<Double> values = new Stack<>(); //stos
    String[] tokens = result.split(" +");
    double answer = 0.0;

    for (String token: tokens)
    {
        if(token != "+" && token != "-" && token != "*" && token != "/")
        {
            double value = Double.parseDouble(token);
            values.push(value);
        }
        else
        {
            double a = values.pop();
            double b = values.pop();
            switch(token)
            {
                case "+":
                    answer = a + b;
                    break;
                case "-":
                    answer = b - a;
                    break;
                case "*":
                    answer = a * b;
                    break;
                case "/":
                    answer = a / b;
                    break;
            }
            values.add(answer);
        }
    }
    return answer;

}

No to wtedy jest number format exception.

1

Ja napisałem trochę inny kod:

if(!isOperator(token))
{
      values.add(Double.parseDouble(token));
}
//i miałem na myśli takie ciało funkcji
private boolean isOperator(String s)
{
     return s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/");
}

Twój błąd wynika ze złego sposobu porównywania Stringów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1