Problem z ONP

0

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?

0

Nie ma błędu :). ONP to jest właśnie notacja postfiksowa, czyli operator po argumentach. Prefiksowa jest NP - zwykła notacja polska.

//edit: thenkles, to chyba tam sie pomylili... zobacz TU

0

No to spójrz na ten link - jak byk jest napisane: " 2+4 w ONP wygląda następująco: +2 4. Widać, że operator poprzedza operandy. " :).

0

http://portalwiedzy.onet.pl/89071,haslo.html

A wykonanie jest banalne... Pobierasz kolejne liczby bądź operatory... kazda liczbe wrzucasz na stos, jesli trafisz operator, to zdejmujesz odpowiednio wiele argumentow ze stosu, wykonujesz i wynik wrzucasz na stos z powrotem. Jesli na stosie znajduje sie mniej niz wymaga operator, to zglaszasz błąd. Prosty wniosek, zeby bledu nie bylo to najpierw trzeba wrzucic argumenty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1