Znalazłem na stronce http://www.algorytm.cad.pl/Algorithms/21-30/algorithm22.html opis algorytmu do zamiany notacji infiksowej na odwrotna notację polską. Próbuję to zaimplementować:
Label1.Caption:='';
for I:=1 to Length(Edit1.Text) do
begin
case Edit1.Text[I] of
#48..#57:Label1.Caption:=Label1.Caption+Edit1.Text[I];
'(':Stos.Items.Add('(');
'+', '-', '*', '/':
begin
J:=Stos.Items.Count-1;
while (J>=0) and (IsOperator(Stos.Items[J][1])) and (OperatorGreater(Stos.Items[J][1], Edit1.Text[I])) do
begin
Label1.Caption:=Label1.Caption+Stos.Items[J];
Stos.Items.Delete(J);
Dec(J);
end;
Stos.Items.Add(Edit1.Text[I]);
end;
end;
end;
for I:=Stos.Items.Count-1 to 0 do
begin
Label1.Caption:=Label1.Caption+Stos.Items[I];
Stos.Items.Delete(I);
end;
Stos jest listboxem; i, j to oczywiście integery. Nie komentujcie niedopracowania tego kodu (np. to, że liczby mogą być tylko jednocyfrowe), chodzi mi tylko o ogólną ideę. Program oczywiście nie działa, dla "2+4" wychodzi "24+", zamiast "+24". I w zasadzie nie dziwię się, bo wg tego algorytmu, nie ma szans, aby operator znalazł się przed liczbą, skoro najpierw pobieramy 2 i wrzucamy na wyjście, a potem dopiero bierzemy operator. Gdzie tam jest błąd?