program baumToArray;
const D=3;
type elem= String; refNode = ^node; node= record key:elem; leftmostChild:refNode; rigthSibling:refNode; end; tRefFeld= ^tFeld; tFeld= record key:elem; sons: array[1..D] of tRefFeld; end; var wurzel,p,q,r:^node; feld: tRefFeld;
procedure alle_schluessel(p: refNode); begin if (p <> nil) then begin writeln(p^.key); alle_schluessel(p^.leftmostChild); alle_schluessel(p^.rigthSibling); end;
end;
function max_grad(p: refNode; grad:integer): integer; var max1,max2,max3:integer; begin if (p = nil) then max_grad := 0 else begin max1:=max_grad(p^.rigthSibling, grad+1); max2:=max_grad(p^.leftmostChild,1); if (max1 > max2) then max3 := max1 else max3 := max2; if (grad > max3) then max_grad := grad else max_grad := max3; end end;
function umwandlung(p: refNode; feld: tRefFeld; stelle:integer): tRefFeld; var i:integer; f:tRefFeld; begin if (p <> nil) then begin writeln(p^.key); new(f); for i:=1 to D do f^.sons[i]:= nil; f^.key := p^.key; if (feld<>nil) then begin feld^.sons[stelle]:=f; end; umwandlung := umwandlung(p^.leftmostChild,f,1); umwandlung := umwandlung(p^.rigthSibling, feld, stelle+1); umwandlung := f; end; end;
procedure durchlauf(feld: tRefFeld); var i:integer; begin if (feld<>nil) then begin writeln(feld^.key); for i:=1 to D do begin if (feld^.sons[i]=nil) then {writeln('-')} else begin {writeln(feld^.sons[i]^.key);} durchlauf(feld^.sons[i]); end; end end; end; BEGIN new(wurzel); wurzel^.key := 'Heinrich'; new(p); p^.key := 'Barbara'; wurzel^.leftmostChild := p; new(q); q^.key := 'Clara'; p^.rigthSibling := q; new(r); r^.key := 'A'; p^.leftmostChild := r; new(p); p^.key := 'B'; r^.rigthSibling := p; new(r); r^.key := 'Dora'; q^.rigthSibling := r; new(p); p^.key := 'D'; r^.leftmostChild := p; new(q); q^.key := 'E'; p^.rigthSibling := q; new(p); p^.key := 'F'; q^.rigthSibling := p; alle_schluessel(wurzel); writeln(); writeln(max_grad(wurzel,1)); writeln(); feld:=umwandlung(wurzel,nil,1); writeln(); durchlauf(feld); END.
In dieser Version testen die Operatoren selber, ob sie zuständig sind. Im Test vergleichen sie die Operation mit ihrem Typ.
Der Operator Const testet, ob der übergebene Wert eine Zahl vom Typ double ist.
import java.util.*;
class Postfix { Operator[] ops; Postfix(Operator[] operators){ ops = operators; } double eval(String expr ){ Stack stack = new Stack(); String teil=""; double erg=0.0; StringTokenizer st = new StringTokenizer(expr," "); while (st.hasMoreTokens()) { teil= st.nextToken(); for (int i=0;i<ops.length ;i++ ) { if (ops[i].test(teil)) { erg=ops[i].rechnen(stack,teil); } // end of if } // end of for }; return erg; } public static void main(String[] args){ String eingabe="3.2 4 + 3 *"; Operator[] ops = {new Const(),new Plus(), new Mult(),new Minus(),new Div()}; Postfix p= new Postfix(ops); System.out.println(p.eval(eingabe)); } }
import java.util.*;
abstract class Operator{ String typ; abstract double rechnen(Stack s, String teil); abstract boolean test(String ausdruck); }
import java.util.*;
class Const extends Operator{ double rechnen(Stack s, String teil){ //System.out.println("c"); s.push(teil); return Double.parseDouble(teil); } Const(){ typ="c"; } boolean test(String ausdruck){ try { double value = Double.parseDouble ( ausdruck ) ; return true; } catch ( Exception e ) { return false; } }; }
import java.util.*;
class Plus extends Operator{ double rechnen(Stack s, String teil){ //System.out.println("+"); double op1= Double.parseDouble((String) s.pop()) ; double op2= Double.parseDouble((String) s.pop()); double erg= op1+op2; s.push(""+ erg); return erg; } Plus(){ typ="+"; } boolean test(String ausdruck){ if (ausdruck.equals(typ)) return true; else return false; }; }
import java.util.*;
class Minus extends Operator{ double rechnen(Stack s, String teil){ //System.out.println("+"); double op1= Double.parseDouble((String) s.pop()) ; double op2= Double.parseDouble((String) s.pop()); double erg= op2-op1; s.push(""+ erg); return erg; } Minus(){ typ="-"; } boolean test(String ausdruck){ if (ausdruck.equals(typ)) return true; else return false; }; }
import java.util.*;
class Mult extends Operator{ double rechnen(Stack s, String teil){ //System.out.println("+"); double op1= Double.parseDouble((String) s.pop()) ; double op2= Double.parseDouble((String) s.pop()); double erg= op1*op2; s.push(""+ erg); return erg; } Mult(){ typ="*"; } boolean test(String ausdruck){ if (ausdruck.equals(typ)) return true; else return false; }; }
import java.util.*;
class Div extends Operator{ double rechnen(Stack s, String teil){ //System.out.println("+"); double op1= Double.parseDouble((String) s.pop()) ; double op2= Double.parseDouble((String) s.pop()); double erg= op2/op1; s.push(""+ erg); return erg; } Div(){ typ="/"; } boolean test(String ausdruck){ if (ausdruck.equals(typ)) return true; else return false; }; }