Herzlich willkommen in der Delphi-PRAXiS, Flo85.
Ich würde es ohne Rekursion versuchen, solange die Ausdrücke noch so einfach sind:
Ein Summand ist entweder eine (vorzeichenbehaftete) Zahl oder ein Ausdruck.
Ein Ausdruck verwendet nur die Operatoren "*" und "/".
Delphi-Quellcode:
// Summanden werden eingekellert, wobei
// Ausdrücke sofort reduziert werden.
function Eval(var s: String; stack: TStack): Boolean;
var
cOperator: Char;
bInvert: Boolean;
begin
Result := GetOperand(s, stack);
while Result do
if s = '' then
begin
while stack.Size > 1 do
stack.Push(stack.Pop + stack.Pop);
Exit;
end else
begin
Result := GetOperator(s, cOperator);
if Result then
begin
bInvert := cOperator = '-';
Result := GetOperand(s, stack);
if Result then
begin
if bInvert then
stack.Push(- stack.Pop);
case cOperator of
'*': stack.Push(stack.Pop * stack.Pop);
'/': stack.Push(1 / stack.Pop * stack.Pop);
end;
end
end;
end;
end;
Freundliche Grüße vom marabu