[JAVA] Convertir la formule en notation polonaise inverse

Aperçu

Ceci est un exemple de programme qui convertit des formules mathématiques en notation polonaise inverse. Source de l'algorithme: http://www.gg.e-mansion.com/~kkatoh/program/novel2/novel208.html Source de la formule: http://www.wdic.org/w/SCI/%E9%80%86%E3%83%9D%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89%E8%A8%98%E6%B3%95

Je vous remercie

Détails

Il est simplement converti en notation polonaise basée sur la formule. Puisque l'algorithme n'est fait qu'en Java, je voudrais remercier la source de la citation.

Rpn.java


/**
 *Citation de l'algorithme: http://www.gg.e-mansion.com/~kkatoh/program/novel2/novel208.html
 */
public class Rpn {
    public static void main(String[] args) {
        //Citation d'expression: http://www.wdic.org/w/SCI/%E9%80%86%E3%83%9D%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89%E8%A8%98%E6%B3%95
        String formula = "a+b"; // ab+
//        String formula = "a+(b*c)"; // abc*+
//        String formula = "(a+b)*c"; // ab+c*
//        String formula = "a*b+c*d+e*f"; // ab*cd*ef*++
//        String formula = "((a+b)*(c+d)+e)*f"; // ab+cd+*e+f*

        System.out.println(getRpn(formula));
    }

    /**
     *Convertir la formule en notation polonaise inverse.
     *
     * @formule param Notation polonaise inverse Formule à convertir
     * @return Formule convertie en notation polonaise inverse
     */
    public static String getRpn(String formula) {
        char[] sequenceList  = formula.toCharArray();
        //StringBuilder pour stocker la valeur de retour
        StringBuilder resultBuilder = new StringBuilder(sequenceList.length);
        Deque<Character> stack = new ArrayDeque<>();

        //Continuez à boucler jusqu'à ce que toutes les formules soient converties en notation polonaise inverse
        for(char token : sequenceList){
            switch (token) {
                case '+':
                case '-':
                    //Si la priorité de l'opérateur empilé est inférieure, l'opérateur de pile est placé dans le tampon.
                    while (!stack.isEmpty()) {
                        char c = stack.getFirst();
                        if (c == '*' || c == '/') {
                            resultBuilder.append(stack.removeFirst());
                        } else {
                            break;
                        }
                    }
                    stack.addFirst(token);
                    break;
                case '*':
                case '/':
                case '(':
                    stack.addFirst(token);
                    break;
                case ')':
                    // 「(De ")Opérateurs jusqu'à "pour tamponner
                    List<Object> list = Arrays.asList(stack.toArray());
                    int index = list.indexOf('(');

                    Deque<Character> workStack = new ArrayDeque<>();
                    for (int i = 0; i <= index; i++) {
                        char c = stack.removeFirst();
                        if (c != '(') {
                            workStack.addFirst(c);
                        }
                    }

                    while (!workStack.isEmpty()) {
                        resultBuilder.append(workStack.removeFirst());
                    }
                    break;
                default:
                    //Dans le cas d'une valeur numérique
                    resultBuilder.append(token);
                    break;
            }
        }

        while (!stack.isEmpty()) {
            resultBuilder.append(stack.removeFirst());
        }
        return resultBuilder.toString();
    }
}

À la fin

S'il vous plaît laissez-moi savoir s'il y a un bogue. S'il n'y a pas de bugs, veuillez l'utiliser (rires) Merci à Internet pour obtenir les informations que vous souhaitez savoir de la source.

Recommended Posts

Convertir la formule en notation polonaise inverse
Notation d'introduction → Notation polonaise inversée → J'ai essayé de calculer
[Exercices cérébraux] Énumération de la notation polonaise inversée et son calcul
Convertir un tableau d'octets Java en une chaîne hexadécimale
Je veux convertir des caractères ...
Convertir le type String en type Timestamp
Convertir en chaîne Ruby Leet
Convertir un objet sérialisable en octet []
Conversion de ○ mois en ○ années ○ mois
Comment convertir la base Java
[Java] Convertir ArrayList en tableau