Przeczytaj
Sposoby zapisywania wyrażeń arytmetycznych
Jak już wiemy, zapis infiksowyzapis infiksowy (w którym operator znajduje się między argumentami) nie jest jedyną postacią zapisu arytmetycznego. W przypadku zastosowania notacji polskiej na początku zapisywany jest operator, a dopiero później argumenty. Innymi słowy, działanie 3 + 3 w notacji polskiej przyjmuje postać + 3 3.
Istnieje również odwrotna notacja polska (ONPONP). W jej przypadku operator jest umieszczony na końcu, za argumentami. Działanie 3 + 3 w ONP zostanie zapisane jako 3 3 +.
Odwrotna notacja polska
ONP, podobnie jak zwykła notacja polska, jest metodą zapisu, w której nie używa się nawiasów. Są one zbędne – działania wykonuje się zawsze na dwóch elementach poprzedzających operator.
Dlaczego jednak w ogóle zajmujemy się odwrotną notacją polską? Sprawia ona wrażenie zupełnie nienaturalnej. Jesteśmy przecież przyzwyczajeni do klasycznej notacji arytmetycznej. Używamy jej w życiu codziennym – na przykład pisząc programy.
ONP odpowiada sposobowi, w jaki procesory przetwarzają informacje. Wykorzystywana jest przy tym struktura danych zwana stosem. Możemy sobie go wyobrazić jako zbiór przedmiotów ułożonych jeden na drugim (tak wygląda choćby stos książek). Jeżeli dokładamy do stosu kolejny przedmiot, trafia on na sam szczyt. Aby wyjąć element położony niżej, należy po kolei zdejmować przedmioty, zaczynając od góry. Innymi słowy, ostatni element dodany do stosu jest dostępny od razu, zaś do pierwszego dostaniemy się na końcu.
Algorytm obliczania wartości wyrażenia zapisanego w ONP jest bardzo prosty. Po kolei odczytujemy elementy wyrażenia. Jeżeli mamy do czynienia z liczbą, umieszczamy ją na stosie. Gdy elementem jest operator, zdejmujemy dwie liczby ze stosu, wykonujemy na nich działanie wskazane przez operator, a otrzymany wynik umieszczamy na stosie. Gdy będziemy tak postępować, po odczytaniu wszystkich elementów wrażenia arytmetycznego na stosie pozostanie tylko jedna liczba (obliczona wartość wyrażenia).
Opisany sposób wykonywania obliczeń ułatwia pracę projektantom procesorów. Pamiętajmy, że procesor nie „patrzy” na zapis arytmetyczny tak samo jak człowiek. Ludzki mózg jest zbudowany w ten sposób, że potrafi grupować argumenty i operatory zgodnie z ustaloną konwencją, np. najpierw wykonuje operacje zapisane wewnątrz pary nawiasów. Procesor także potrafiłby to zrobić, ale komplikowałoby to jego konstrukcję (i podnosiło cenę). O wiele prostsze (i tańsze) są układy, które albo zapisują dane na stosie, albo wykonują operacje na jego dwóch elementach.
Obliczanie wartości wyrażenia arytmetycznego
Spróbujmy obliczyć wartość wyrażenia zapisanego w ONP, np. 2 8 + 7 5 * +.
Obliczenia rozpoczynamy, mając pusty stos. Odczytujemy pierwszy element wyrażenia. Jest nim liczba 2. Zostaje ona umieszczona na stosie:

Postąpiliśmy zgodnie z przedstawionym wcześniej algorytmem. Ponieważ 2 jest liczbą, powinna znaleźć się na stosie. Przechodzimy do kolejnego elementu. Jest nim liczba 8, a więc ją również umieszczamy na stosie.

Kolejnym elementem jest operator dodawania. Zdejmujemy zatem ze stosu dwie liczby i dodajemy je do siebie:

Otrzymaną sumę umieszczamy na stosie:

Sprawdzamy kolejny element wyrażenia. Jest nim liczba 7, która trafia na szczyt stosu:

Tuż za nią znajduje się liczba 5, ją również umieszczamy na stosie:

Kolejnym elementem jest operator mnożenia. Pobieramy zatem ze stosu dwie liczby i mnożymy je przez siebie:

Otrzymany iloczyn trafia na stos:

Pozostał ostatni element wyrażenia: jest on operatorem dodawania. Odczytujemy dwie liczby pozostające jeszcze na stosie i dodajemy je do siebie:

Sumę umieszczamy na stosie:

Odczytaliśmy już wszystkie elementy wyrażenia, postępując zgodnie z przedstawionym wcześniej algorytmem. Na stosie znajduje się tylko jedna liczba. Jest ona obliczona wartością wyrażenia. A zatem: (2 + 8) + (7 * 5) = 2 8 + 7 5 * + = 45.
W następnej sekcji zajmiemy się przełożeniem na język Java algorytmu obliczania wartości wyrażeń zapisanych z wykorzystaniem ONP. Zastanówmy się jednak najpierw, jak utworzyć stos.
Okazuje się, że nie jest to trudne. Rozpoczniemy od zdefiniowania tablicy, która będzie pełnić funkcję stosu. Zdefiniujemy również zmienną przechowującą indeks pierwszego niezapełnionego miejsca w tablicy (początkowo będzie nim oczywiście 0).
Umieszczając elementy na stosie, będziemy zapisywać je na pierwszym wolnym miejscu. Jego indeks odczytamy ze zdefiniowanej wcześniej zmiennej, a następnie zwiększymy jej wartość (ponieważ pierwsze wolne miejsce w tablicy zostało właśnie zajęte). Kiedy natomiast będziemy zdejmować liczbę ze stosu, zmniejszymy wartość zmiennej przechowującej indeks wierzchołka stosu.
Możemy już zająć się pisaniem programu obliczającego wartości wyrażeń przedstawionych z zastosowaniem odwrotnej notacji polskiej.
Słownik
skrót terminu odwrotna notacja polska
sposób zapisywania wyrażeń arytmetycznych, w którym operator jest umieszczony między argumentami (np. 7 + 4,16 / 2,48 * 11)