AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Binärbaum für Terme

Ein Thema von Johannes Maier · begonnen am 9. Sep 2004
Antwort Antwort
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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf