Introduction
L'évaluation d'une expression sans utiliser de pile n'est malheureusement pas aussi fiable. Le principe est simple, il faut parcourir la chaine de caractères et tenter de simplifié l'expression en enlevant dans la chaine de caractères les parties de l'expression résolu et recopie les solutions dans la chaine de caractères jusqu'à ce qu'il n'y est plus rien à résoudre. Cet algorithme nécessite un langage de programmation très fort dans la manipulation des chaines de caractères, ainsi, cet algorithme devient assez fastidieux en langage de programmation comme le C. Il est donc préférable d'utiliser du Pascal ou du Basic.
Exemple
L'exemple suivant, écrit en Free Pascal, permet de monter comment cet algorithme fonctionne :
- Program EvalRawSamples;
-
- Function Formula(S:String):Real;
- Const
- O : Array[0..3] of Char = '*/+-';
- Var
- H,I,J:Byte;
- a,b:Real;
- Err:Word;
- aS,bS,T:String;
- BreakWhile:Boolean;
- Begin
- Formula := 0.0;
- If(S = '')Then Exit;
- For H := 0 to 3 do While (Pos(O[H],S) > 0) do Begin
- J := 1;
- I := 1;
- BreakWhile := False;
- While (Not BreakWhile) and (I <= Length(S)) do Begin
- BreakWhile := False;
- If(S[I] = O[H])Then
- Begin
- aS := Copy(S,J,I-J);
- Inc(I);
- bS := '';
- While (S[I] in ['0'..'9','.','E']) do Begin
- bS := bS + S[I];
- Inc(I);
- If(I > Length(S))Then Break;
- End;
- Val(aS,a,Err);
- Val(bS,b,Err);
- Case H of
- 0 : Str(a * b:1:38,T);
- 1 : Str(a / b:1:38,T);
- 2 : Str(a + b:1:38,T);
- 3 : Str(a - b:1:38,T);
- End;
- S := Copy(S,1,J-1) + T + Copy(S,I,255);
- If aS = ''Then Begin
- Val(S,a,Err);
- Formula := a;
- Exit;
- End;
- BreakWhile := True;
- End
- Else
- If Not(S[I] in ['0'..'9','.','E'])Then J := I + 1;
- Inc(I);
- End;
- End;
- Val(S,a,Err);
- Formula := a;
- End;
-
- BEGIN
- WriteLn('8+8=',Formula('8+8'):0:0);
- WriteLn('8*8+3=',Formula('8*8+3'):0:0);
- WriteLn('8-9=',Formula('8-9'):0:0);
- WriteLn('-9*3=',Formula('-9*3'):0:0);
- WriteLn('9.3*9.1+9.0625*9.67/3.34*3+7.8=',Formula('9.3*9.1+9.0625*9.67/3.34*3+7.8'):0:3);
- END.
-
on obtiendra le résultat suivant :
8+8=168*8+3=67
8-9=-1
-9*3=-27
9.3*9.1+9.0625*9.67/3.34*3+7.8=101.176