Am Ende wird nur das Element des Stapels Wurzel des Ausdrucksbaums sein. Wir durchlaufen den Eingabeausdruck und folgen für jedes Zeichen. Wenn character is operator ist, machen Sie zwei Werte aus dem Stack, machen Sie sie zu ihrem Kind und drücken Sie den aktuellen Knoten erneut. Jetzt verwenden wir einen Stapel, um den Ausdrucksbaum zu konstruieren. Dieser Artikel wurde von Utkarsh Trivedi beigesteuert. Um dies zu tun, muss ich einen algebritischen Ausdruck im Binärbaum analysieren und dann das Ergebnis berechnen und zurückgeben. Für den ersten Schritt, wie kann ich einen Ausdruck in einem Binärbaum analysieren? Besuche zuerst das richtige Kind. Wir werden einige Beispiele diskutieren, um die Höhe des Binärbaums zu berechnen. Wir sind der erzeugende Binärbaum in der Hauptmethode. Die HeightOfTree-Klasse wird verwendet, um die Höhe des Binärbaums mithilfe des ersten Suchalgorithmus der Tiefe zu finden.
Du machst einen sehr guten Punkt! Dem Programm fehlt die Hauptfunktionalität eines Ausdrucksparsers, der einen Ausdruck nimmt und daraus einen Baum erstellt. Die Anwendung dieser Baumtypen kann auf ein breiteres Feld der Datenmanipulation ausgeweitet werden. Obwohl nicht schwierig geändert, wurde dies absichtlich getan, um das Beispiel klar und nicht schwer zu verstehen. Die Lösung besteht darin, Klammern zu verwenden, um Operationen zu gruppieren. Anstatt am Anfang des Ausdrucks zu erscheinen, erscheinen die Operatoren am Ende des Ausdrucks. Ausdrücke im Infix werden gelöst, indem man von der innersten Klammergruppe ausgeht und nach außen arbeitet. Wenn Operationen gestapelt werden, wird es schwierig zu sehen, wie diese Operanden gruppiert sind, aber aufgrund der Natur der Präfix-Notation sind keine Klammern erforderlich, um sie zu gruppieren. Dies bildet den Wurzelknoten des Baumes. Die Node-Klasse enthält alles, was zum Einrichten und Auswerten von Ausdrücken benötigt wird.
Infix schafft jedoch ein paar Probleme. Dies könnte mit regulären Ausdrücken oder sogar Stapelmanipulation erreicht werden. Gehe nach links, wenn der Knoten kein unmittelbarer Wert ist. Um den Baum zu lösen, rufen Sie einfach die Solve-Methode auf: Console. Die Darstellung von Infix-Ausdrücken in einem Baum ist aufgrund der Reihenfolge der Operationen ziemlich kompliziert. Um einen Baum zu erstellen, rufen Sie einfach den Konstruktor für die Klasse auf. Das Programm, so wie es aussieht, könnte viele Verbesserungen bringen.
In meinem Mathe-Kurs behandelten wir eine Lektion über Graphentheorie, und als eine Aufgabe sollten wir Ausdrücke nehmen, sie in Bäume setzen und sie bewerten. Jeder Knoten darunter wird von den Gruppen bestimmt, die am stärksten an den Hauptoperator gebunden sind. Im Präfix erscheinen alle Operatoren nahe dem Anfang der Gleichung, wobei die beiden Operanden unmittelbar danach erscheinen. Sehr große Bäume verursachen einen Überlauf und das Programm stoppt. Um die Präfix-, Infix - oder Postfix-Notationen für den Ausdruck zu finden, rufen Sie die entsprechenden Funktionen auf, die alle Zeichenfolgen zurückgeben. Von den drei Notationen ist Infix diejenige, mit der wir alle am vertrautesten sind. Unter Verwendung einfacher Rekursionstechniken ist es fast trivial, binäre Bäume in irgendeiner Weise zu manipulieren. Beachten Sie, dass der Konstruktor zuerst den Operator und dann die linken und rechten Werte verwendet. Wenn sowohl die linken als auch die rechten Werte eines Knotens aufgezeichnet werden, kann der Operator, der sie bindet, geschrieben werden. Recht, Seiten zu wechseln.
Zwei davon sind fast identisch, und der dritte ist jedem bekannt, da wir normalerweise Gleichungen schreiben. Gegenwärtig wird keine Validierung des Ausdrucks durchgeführt, um zu testen, ob er lösbar ist. Es ist eine sehr einfache, kurze Klasse, die die Funktionalität implementiert, die benötigt wird, um Ausdrucksbäume zu lösen, sowie ihre Struktur im Präfix-, Postfix - und Infix-Format auszugeben. Vor kurzem bin ich auf die Notwendigkeit gestoßen, binäre Bäume auf der Basis eines mathematischen Ausdrucks als Eingabe zu erstellen. Es wäre interessant zu sehen, dass Klassen für jede Art von Daten entwickelt wurden, nicht nur für Zahlen. Dies ist aufgrund der Tatsache, dass die Funktionen wiederholt, um ihre Ergebnisse zu finden, und als solcher füllt der interne Stapel ziemlich schnell. Drei Funktionen werden zur Ausgabe von Ausdrücken in Postfix-, Präfix - und Infix-Formaten bereitgestellt. Diese Art der Notation ist in Programmiersprachen und dergleichen sehr üblich, da sie mit Stacks nicht schwer lösbar ist. Postfix ist einfach eine Variante des Präfixes. Die Verantwortung liegt derzeit beim Benutzer, einen guten Ausdruck zu liefern.
Aus diesem Grund habe ich dieses Programm geschrieben. Dies wird fortgesetzt und wiederholt, bis keine weiteren Operatoren übrig sind. Wenn die linke Seite nicht verfügbar ist, gehen Sie zum Knoten über Ihnen und gehen Sie nach rechts. Ausdrücke im Präfix werden durch Scannen der Gleichung nach einem Operator mit zwei unmittelbaren Werten rechts davon gelöst. Der Code selbst ist in einer einfachen Klasse mit Methoden zum Zurückgeben des Ausdrucks in allen drei Notationen sowie einer Funktion zum Lösen eines Baums eingekapselt. Hinweis: Wie dieser Code implementiert wurde, werden Ausdrücke, die in der Infix-Notation dargestellt werden, immer vollständig geklammert. Wenn ich Zeit habe, werde ich sicher sein, dass ich versuche, diese Funktion zu implementieren. In dieser Notation erscheinen alle binären Operatoren zwischen den beiden Operanden.
Aufgrund der möglichen Mehrdeutigkeit bei der Interpretation müssen auch Vorrangregeln befolgt werden. Das Schreiben dieser Klasse erwies sich als einfacher, als ich ursprünglich gedacht hatte, und es hat definitiv meine Schularbeit beschleunigt! Im obigen Beispiel ist das Multiplikationszeichen der Hauptoperator. Diese Art der Notation ist wohl am einfachsten zu verwenden. Aufgrund der Funktionsweise des Lösungsalgorithmus und der Notationsfunktionen sind die Bäume in ihrer Größe begrenzt. Sie können tatsächlich eine Tokenklasse erstellen, wenn Sie möchten. CalculatorExpression verwendet eine Infix-Zeichenfolge, konvertiert die Infix-Zeichenfolge in Postfix und nimmt schließlich das Postfix in eine interne BinaryExpression-Baumdarstellung. Helfer, um Postfix-Notation zu generieren.
Dann kann Ihr Parsing-Code jedes logische Bit auf einmal verbrauchen. Ausdruck als der Name, wie es überall im System laufen wird. Hier ist die Methode, mit der ich den gewünschten Binärbaum basierend auf dem BinaryTree darstellen konnte. BinaryTree-Klasse zum Speichern des Postfix-Ausdrucks. Alles auswählen In neuem Fenster öffnen BinaryTree. Infix und Postfix sind nur beim Parsen und Serialisieren relevant. Dann infix und postfix adressieren nur den Prozess des Parsens und der Serialisierung dieses Baumes. Dies funktioniert, um den binären Baum zu erzeugen, der Ihrem Beispiel entspricht, aber ich musste eine Präfix-Notation verwenden; Sie können versuchen, die Logik umzukehren, wenn Sie eine direkte Postfix-Lösung wünschen. Beigefügt ist ein Dokument mit vollständigen Spezifikationen.
Hinweis: Ich brauche das in weniger als 8 Stunden. Es muss einen Binärbaum verwenden. RPN-Stack für diesen Ausdruck. Gegenwärtig erstellt Parse den Ausdrucksbaum falsch. Gibt eine Zeichenfolgendarstellung des Ausdrucks zurück. Werbung wird für registrierte Benutzer entfernt. Die Java-Programmierforen sind eine Gemeinschaft von Java-Programmierern aus der ganzen Welt.
Die professionelle, freundliche Java-Community. Verarbeitet Zahlen, Operatoren und Funktionen. Gibt ein Objekt zurück, mit dem diese Funktion ausgewertet wird. Werden Sie ein Teil der Community, helfen Sie anderen, erweitern Sie Ihr Java-Wissen und unterhalten Sie sich mit Gleichgesinnten. Unsere Mitglieder haben eine breite Palette von Fähigkeiten und sie alle haben eines gemeinsam: Eine Leidenschaft, Java zu lernen und zu programmieren. Mitglieder haben vollen Zugang zu den Foren. Wir freuen uns darauf, Sie zu treffen. Wenn das Token eine Zahl ist, fügen Sie es der Ausgabewarteschlange hinzu. Die einzige Funktion, die auswertet, ist sin, aber Sie können Ihre eigenen hinzufügen, indem Sie zu Funktion gehen.
Wir laden Anfänger von Java-Programmierern bis hin zu Java-Profis ein, um hier zu posten und Ihr Wissen zu teilen. Erstellt einen neuen Parser für eine Gleichung. Nur ausgewertet, wenn geparst wird. Wenn das Token ein Funktionsmarker ist, schieben Sie es auf den Stapel. Die Registrierung ist schnell und am besten kostenlos. Wenn das Token eine linke Klammer ist, schieben Sie es auf den Stapel. Wenn das Token oben im Stapel ein Funktionstoken ist, setzen Sie es in die Ausgabewarteschlange. Gleiches gilt für alle Operatoren. Um mit auszuwerten und von Zahl zu unterscheiden, erwägen Sie, das Zahlenfeld in Wert umzubenennen. Wenn ich einen unären Operator wie Negation, Quadratwurzel, Fakultät oder etwas ähnliches hinzufügen möchte, müsste ich nicht nur einen Fall hinzufügen, sondern auch eine neue Basisklasse für Unary-Operatoren und eine Factory definieren Methoden zu ihrer Herstellung und eine Reihe anderer Dinge.
Das ist einer der Gründe, warum es als schlechte Praxis gilt, Ausnahmen zu bekommen. Dann machen Sie die Betreiber verantwortlich für die Handhabung der Anpassung des Stapels. Analysieren Sie das Token stattdessen zu einem Operator, und nur wenn das passiert, kennen Sie das eigentliche Problem. Halten Sie main auf ein paar Zeilen, genug um die REPL-Klasse zu instanziieren und auszuführen. Strings und Entwicklung mit Java 7 oder später, dann schlage ich auch vor, einen Schalter in der statischen Methode BinaryOperator zu verwenden. Dieser Kurs ist sehr einfach, aber es gibt ein paar kleine Änderungen, die Sie vornehmen können, um Ihren Schülern sofort gute Gewohnheiten beizubringen. Es wäre großartig, den Operator selbst von seiner Verwendung in einem Ausdruck mit linken und rechten Werten zu trennen.
Ihr Fang von RuntimeException ist redundant. Runtime Exceptions werden auch beim Abfangen von Exception abgefangen. Diese Befehle erzeugen entweder mehrere Ergebnisse, nehmen abhängig von den Werten anderer Argumente eine unterschiedliche Anzahl von Argumenten an oder sind zustandsbehaftet, wobei sich ihre genaue Bedeutung in Abhängigkeit von früheren Teilen des Programms ändert. JVM und den Prozess beenden. Anstatt eine generische RuntimeException zu erzeugen, wenn Sie durch Null dividieren, erstellen Sie eine benutzerdefinierte DivideByZeroException oder noch besser, behandeln Sie NaN innerhalb von Number und den anderen Operatoren. Eine Sache fällt mir hier in Ihrem Programm besonders auf, und Sie machen es sehr schwer, dies zu erweitern, um andere Arten von Operatoren zuzulassen. Wenn ja, schlage ich stattdessen vor, Zeichen zu verwenden. Zuerst der CLI-Code: import java. Sie haben die ganze Geschichte in Ihrer Hauptmethode.
Sollte die Auswertung eine Zahl anstelle eines rohen Doppels liefern? Analysiere einen Ausdrucksbaum, der eine Zeichenfolge erhält, und gebe den resultierenden Baum zurück. Verwenden Sie das vollständige JavaDoc für Methodenkommentare. Die Parsing-Methode muss in Methoden neu strukturiert werden, um die Eingabe zu scannen, jedes Token zu analysieren, es auf den Stack anzuwenden und schließlich das Ergebnis zurückzugeben. Alternativ betrachten Sie auch Enums. Ansonsten: System. Sie können dies fallen lassen. Dieser ist ein einfacher Postfix-Rechner.
Möglicherweise möchten Sie das auf andere Methoden verschieben. Es wird allgemein als einfacher angesehen, benannte Konstanten anstelle langer Strings zu verwenden. Wie sieht das für Sie aus? System. Sobald Sie diese verallgemeinerten Operatoren unterstützt haben, können Sie eine interaktive Konsole darauf erstellen, in der Benutzer Befehle ausgeben, die dann dem Stapel hinzugefügt werden, der dann zwischen Eingabeaufforderungen beibehalten wird und erweiterte Berechnungen ermöglicht. Operatoren komplett von Expressions. Der erste Schritt besteht darin, diesen Code in eine separate Klasse zu verschieben, die den Stapel verwalten und die Arbeit über Methoden hinweg bearbeiten kann.
Der einzelne auf dem Stapel verbliebene Gegenstand ist die Wurzel des Baumes. Dies erleichtert die Wiederverwendung und das Schreiben von Komponententests und begrenzt die Lücke zwischen der JVM, die Ihre Anwendung mit Argumenten startet, und der Anwendung selbst. Add, rufen Sie einfach Add. Der Operator sollte wissen, wie viele Operanden er benötigt, und er sollte den Stack selbst erhalten, anstatt zwei Werte in der Schleife abzuziehen. InvalidExpressionException wird bei ungültiger Eingabe ausgelöst. Add ist dann dafür verantwortlich, die obersten zwei Ausdrücke vom Stapel zu nehmen und einen von ihnen gebildeten Additionsausdruck auf den Stapel zu legen. Der Parser tut viel zu viel, um ihn in eine einzige Methode zu stopfen, und da er weiß, dass jeder Operator zwei Operanden benötigt, malt er sich in eine Ecke. OutOfMemoryError, StackOverflowException und dergleichen.
Kommentare
Kommentar veröffentlichen