On se retrouve aujourd'hui pour la solution du précédent #KataOfTheWeek proposé par Jordan en début de semaine !

Une des approches possible est de spliter la chaine, et boucler sur chacun des éléments, si on tombe sur un chiffre, on l'ajoute dans une pile, si on tombe sur un opérateur, alors on pop les deux derniers éléments ajoutés et les additionner, soustraire, multiplier ou diviser en fonction de ce dernier, puis mettre le résultat dans la pile, et on continue jusqu'à tomber sur le dernier opérateur et ainsi retourner le résultat final.

La solution peut être la suivante :

public class ReversePolishNotation {

    /**
     * Get the result of the RPN input.
     *
     * @param input the RPN
     * @return the result as Double
     */
    public static Double calc(String input) {
        Stack<Double> numbers = new Stack<>();
        Arrays.asList(input.split(" ")).stream().forEach(number -> {
            switch(number) {
                case "+":
                    calcSign(numbers, (n1, n2) -> n2 + n1);
                    break;
                case "-":
                    calcSign(numbers, (n1, n2) -> n2 - n1);
                    break;
                case "*":
                    calcSign(numbers, (n1, n2) -> n2 * n1);
                    break;
                case "/":
                    calcSign(numbers, (n1, n2) -> n2 / n1);
                    break;
                default:
                    numbers.push(Double.parseDouble(number));
            }
        });
        return numbers.pop();
    }

    /**
     * Insert the operation's result in the stack and return it.
     *
     * @param numbers the stack which contains all previously added numbers
     * @param operation the operation to apply on both last inserted number
     * @return the stack with the new added operation's result
     */
    static Stack<Double> calcSign(Stack<Double> numbers, BiFunction<Double, Double, Double> operation) {
        numbers.push(operation.apply(numbers.pop(), numbers.pop()));
        return numbers;
    }

}

A bientôt pour un nouveau #KataOfTheWeek !