Odwrotną notację polską ONP (ang. RPN – Reverse Polish Notation), zwana często również notacją Postfix, wymyślono w celu zapisywania dowolnych wyrażeń
arytmetycznych bez nawiasów. W normalnym zapisie arytmetycznym operatory
znajdują się pomiędzy argumentami:
2 + 2 6 - 4
3 * 5 12 / 3
Operatory posiadają priorytety, czyli "ważność". Jeśli w
wyrażeniu wystąpią operatory o różnych priorytetach, to najpierw zostaną
wykonane te ważniejsze:
3 + 5 * 2 = 3 + 10 = 13
Jeśli chcemy zmienić kolejność wykonywania działań, musimy używać
nawiasów:
(3 + 5) * 2 = 8 * 2 = 16
W ONP problem ten nie występuje. Operator zawsze występuje po
swoich argumentach:
2 2 + 6 4 -
3 5 * 12 3 /
Dzięki tej prostej zasadzie nawiasy stają się zbędne:
3 + 5 * 2 → 3 5 2 * + = 3 10 + =
13
(3 + 5) * 2 → 3 5 + 2 * = 8 2 * =
16
Do obliczenia wartości wyrażenia zapisanego w ONP potrzebujemy
stosu. Zasada jest następująca:
Wyrażenie ONP przeglądamy od strony lewej do prawej. Jeśli
napotkamy liczbę, to umieszczamy ją na stosie. Jeśli napotkamy operator, to
ze stosu pobieramy dwie ostatnie liczby, wykonujemy na nich działanie zgodne
z napotkanym operatorem i wynik umieszczamy z powrotem na stosie. Gdy
wyrażenie zostanie przeglądnięte do końca, na szczycie stosu będzie
znajdował się jego wynik.
Notacja ONP jest szeroko wykorzystywana w kompilatorach języków
wysokiego poziomu. Istnieją również języki, które do obliczeń stosują jedynie
ONP – np. Forth.
Przed przystąpieniem do zaprojektowania algorytmu ONP musimy
poczynić pewne ustalenia. Dla prostoty umawiamy się, że używać będziemy tylko
czterech operatorów arytmetycznych:
- + – dodawanie
- - – odejmowanie
- * – mnożenie
- / – dzielenie
Wyrażenie musi być poprawne – algorytm nie sprawdza jego
poprawności.
Każdy element będzie wprowadzany w osobnym wierszu – w ten sposób
pozbędziemy się problemu analizowania tekstu pod kątem zawartości w nim liczb i
operatorów. W rzeczywistości wyrażenie zawarte w wierszu zostałoby najpierw
rozbite na elementy składowe – liczby i operatory – a następnie elementy te
zostałyby użyte do obliczenia wartości wyrażenia wg naszego algorytmu.
Liczby muszą mieć postać akceptowaną przez dany język
programowania.
Ostatnim elementem wyrażenia jest znak "=". Powoduje on
zakończenie obliczeń i wyprowadzenie wyniku ze stosu.
W algorytmie będziemy musieli rozpoznawać, czy wprowadzony
element
jest liczbą, czy też operatorem lub znakiem "=". W trzech wybranych przez nas
językach można to zrobić następująco:
Brak komentarzy:
Prześlij komentarz