2016-08-30 3 views
1

Ich versuche, eine Anwendung, die in einer Algebra-Gleichung eingespeist wird und löst für eine bestimmte Variable der Benutzer zu wählen.Datenstruktur für eine Algebra-Gleichung?

Pseudocode unten

enum Variable 
    x, pi, y, z; //.. etc 

class Value 
double constant; 
Variable var; 

class Term 
Value val;    // Might be a variable or a constant 
Expression exponent; // The exponent of this term 
boolean sign;   // Negative flag 

class Expression 
LinkedList<Term>;  // All the terms in this expression 
^ This is what I need help on. 

Expression exponent; // The exponent of this term 

Zum Beispiel der durchschnittliche Gleichung könnte sein:

y   =  x  +    (x - 5)^z 
^term    ^term ^operator ^expression^term 

Ich brauche diese Informationen in irgendeiner Art von Datenstruktur zu speichern, jedoch um durch sie zu analysieren. Wie Sie oben sehen, wenn ich LinkedList<Term> schrieb, funktioniert es, aber es gibt keine Möglichkeit für mich, Operatoren zu implementieren.

das obige Beispiel verwenden, das ist, wie ich meine Datenstruktur aussehen soll:

// Left side of the equals sign 
{ NULL <-> y <-> NULL } 

// Right side of the equals sign 
{ NULL <-> x <-> Operator.ADD <-> Expression: (x - 5) <-> NULL } 

ich dies aber nicht tun können, weil LinkedList Bedürfnisse eines Datentyps sein, was sein muss Ausdruck. Wie sollte ich Operatoren darstellen?

+0

Kann ich als Unterklasse des Begriffs vorschlagen? was, als eine Beziehung, notwendigerweise die Beschränkung halten, um ein vorheriges und ein nächstes Element zu haben? – Flint

+0

Ich habe ein bisschen Schwierigkeiten zu verstehen, was du meinst? Meinst du, dass meine Term-Klasse zwei Felder (rechts und links) hat, um sie darüber zu informieren, welcher Operator sich links oder rechts davon befindet? – Hatefiend

+0

In Ihrem Beispiel sind Begriffe in einer verknüpften Liste. Schließlich enthalten Elemente einer verknüpften Liste Verweise auf die vorherigen und nächsten Elemente dieser Liste. Sagen wir, Operatoren sind Ausdrücke (Unterklassen) mit einer zusätzlichen Regel: Sie haben auf beiden Seiten wörtliche Ausdrücke oder Ausdrücke. Vergesse jetzt, was ich gesagt habe, folge den Vorschlaegtypdef-Ratschlägen und verwende stattdessen einen abstrakten Syntaxbaum: Blätter und Knoten tragen diese Eigenschaften natürlich. – Flint

Antwort

3

Es ist wesentlich einfacher, mit Ausdrücken zu arbeiten, wenn Sie sie als abstrakte Syntaxbäume darstellen, Baumstrukturen, die die zugrunde liegenden Strukturen von Formeln zeigen. Ich würde dringend empfehlen, hier zu untersuchen, wie man ASTs benutzt; Sie bauen sie normalerweise mit einem Parsing-Algorithmus auf (Dijkstra's Rangieryard-Algorithmus funktioniert auf Grund Ihrer Konfiguration sehr gut) und verwendet dann entweder abstrakte Methoden oder das Besuchermuster, um die ASTs zu durchlaufen, um die benötigten Berechnungen durchzuführen.

ASTs werden oft dadurch dargestellt, dass entweder eine Schnittstelle oder eine abstrakte Klasse einen Knoten in der Struktur darstellt, dann Unterklassen für jeden Operator (sie repräsentieren interne Knoten) und Unterklassen für Konzepte wie "Zahl" oder " Variable "(normalerweise sind sie Blätter).

Wenn Sie ein Gefühl dafür bekommen möchten, wie dies aussehen könnte, habe ich eine tool to generate truth tables for propositional logic formulas mit diesen Techniken implementiert. Die JavaScript source zeigt, wie man ASTs und den Shunting-Yard-Algorithmus verwendet.

+0

Hey danke für so eine gute Antwort. Ich bin ein CS-Student im dritten Jahr, aber ich habe noch nie davon gehört. Ich schaute online und konnte nur feststellen, dass ASTs verwendet werden, um ein Problem zu zeigen, * bevor * versucht wurde, eine Implementierung dafür zu machen. Ist es das, was du meintest? Dass ich mehr darüber nachdenken muss, diese Idee vollständig auszuarbeiten? Ich bin verwirrt. – Hatefiend

+0

ASTs werden definitiv in der aktuellen Software verwendet, um alle Arten von Problemen zu lösen (sie werden in Compilern verwendet, um Eingabeprogramme darzustellen). Ich vermute, Sie müssen vielleicht ein bisschen mehr suchen. – templatetypedef

+0

Nur stellen sicher, ASTs sind wie eine TreeMap von Java, aber ohne bereitgestellten Typ, nicht wahr? Ex. 'TreeMap x = neue TreeMap;' – Hatefiend