Binärbaum für Terme
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:
Vielen Dank schonmal im Voraus ;)
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. MfG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz