Thema: Delphi Binärbaum für Terme

Einzelnen Beitrag anzeigen

Johannes Maier

Registriert seit: 3. Sep 2004
25 Beiträge
 
Delphi 7 Professional
 
#1

Binärbaum für Terme

  Alt 9. Sep 2004, 17:30
Hi,

kann sich mal einer diesen von mir geschriebenen Code für einen Binärbaum anschauen, ob alles soweit richtig ist? Denn ich mache solch einen Baum zu ersten Mal, und bei dem Parser, den ich vorhabe zu schreiben, ist es wichtig, dass der Baum seine Arbeit tut, und zwar soll in ihm ein Term gespeichert werden. Jeweils die Operatoren rechts, und die Zahlen links davon.
Die Funktionen zum Auslesen un auswerten des Baums fehlen noch, sind aber im Moment nicht so wichtig.

Später kommt in der procedure Add(Data: TData) noch eine Abfrage, ob kein Operator mehr im zu parsenden Term übrig ist, so dass dann die Variable bzw. die Zahl am Schluss auch rechts stehen kann (also in myRight).

Delphi-Quellcode:
unit uParser;

interface

type
  TOperator = (opAdd, opSub, opMul, opDiv,
               opPot, opSin, opCos, opExp);

  TTokenType = (tkVar, tkOp, tkVal);

  TData = record
    case Token: TTokenType of
      tkOp: (Operator: TOperator);
      tkVal: (Value: Extended);
      tkVar: ();
  end;

  PNode = ^TNode;

  //Knotenklasse
  TNode = class(TObject)
  private
    myLeft, myRight: PNode;
    myData: TData;
  public
    constructor Create(Data: TData);
    destructor Destroy; override;
    procedure Add(Data: TData);
    function GetOperator: String;
    function GetValue: Extended;
  end;

  //Binärbaum, zeigt auf den Kopfknoten
  TBinaryTree = class(TObject)
  private
    myHead: PNode;
  public
    constructor Create(Data: TData);
    destructor Destroy; override;
    procedure Add(Data: TData);
  end;

implementation

{Deklarationen von TNode}

constructor TNode.Create(Data: TData);
begin
  myData := Data;
  myLeft := nil;
  myRight := nil;
end;

procedure TNode.Add(Data: TData);
begin
  if Data.Token = tkOp then begin
    if myRight = nil then
      myRight := Pointer(TNode.Create(Data))
    else
      myRight.Add(Data);
  end else begin
    if myLeft = nil then
      myLeft := Pointer(TNode.Create(Data))
    else
      myRight.Add(Data);
  end;
end;

function TNode.GetOperator: String;
begin
  if myData.Token = tkOp then begin
    case myData.Operator of
      opAdd: Result := '+';
      opSub: Result := '-';
      opMul: Result := '*';
      opDiv: Result := '/';
      opPot: Result := '^';
      opSin: Result := 'sin';
      opCos: Result := 'cos';
      opExp: Result := 'exp';
    end;
  end;
end;

function TNode.GetValue: Extended;
begin
  if myData.Token = tkVal then
    Result := myData.Value;
end;

destructor TNode.Destroy;
begin
  myLeft.Destroy;
  myRight.Destroy;
  myLeft := nil;
  myRight := nil;
  inherited Destroy;
end;

{Deklarationen von TBinaryTree}

constructor TBinaryTree.Create(Data: TData);
begin
  myHead := Pointer(TNode.Create(Data));
end;

procedure TBinaryTree.Add(Data: TData);
begin
  myHead.Add(Data);
end;

destructor TBinaryTree.Destroy;
begin
  myHead.Destroy;
  myHead := nil;
  inherited Destroy;
end;

end.
Vielen Dank schonmal im Voraus

MfG
Johannes Maier
  Mit Zitat antworten Zitat