Odwrotna Notacja Polska Odwrotna Notacja Polska w skrócie ONP) jest sposobem zapisu wyrażeń arytmetycznych. Znak wykonywanej operacji umieszczany jest po operandach, argumentach tzw. zapis postfiksowy). ktualnie stosuje się dwie notacje zapisu wyrażeń : infiksowa wrostkowa): argument1 operator argument2 postfiksowa przyrostkowa): argument1 argument2 operator Poniższa tabela przedstawia przykładowe zapisy w obu notacjach. UNIWERSYTET EKONOMICZNY W KRKOWIE Notacja infiksowa Notacja postfiksowa + B B + B C) D B C D Zapis wyrażeń w notacji postfiksowej jest najczęściej wykorzystywany do sprawdzenie poprawności wyrażenia jak i do samego obliczenia wyniku końcowego. Konwersja wyrażenia z postaci infiksowej na postać postfiksową Podstawowe zasady obowiązujące w trakcie konwersji: kolejność argumentów w postaci infiksowej i postfiksowej jest taka sama, zmianie ulega kolejność operatorów, wyrażenie w postaci infiksowej jest analizowane od lewej do prawej strony, po odczytaniu argumentu jest on natychmiast zapisywany do wyrażenia w postaci postfiksowej, odczytane operatory przechowywane są na stosie. lgorytm konwersji przedstawia sie następująco: 1.usuwamy wszystkie elementy ze stosu na początku konwersji stos musi być pusty), 2.jeżeli odczytany został operator i stos jest pusty to operator umieszczamy na stosie, 3.jeżeli odczytany został operator o wyższym priorytecie niż operator znajdujący się na wierzchołku stosu to odczytany operator umieszczany na stosie. W przeciwnym przypadku ze stosu usuwamy operator znajdujący się na jego wierzchołku i umieszczamy go on na końcu wyrażenia w postaci postfiksowej. Dalszy sposób postępowania z odczytanym operatorem jest określony przez ponowna realizację punktu 2 lub punktu 3, 4.jeżeli został osiągnięty koniec analizowanego wyrażenia zapisanego w postaci infiksowej to ze stosu usuwamy kolejno znajdujące się tam operatory i dopisujemy je do wyrażenia w postaci postfiksowej. istnieje jeszcze notacja prefiksowa przedrostkowa), jest to tak zwana notacja polska najpierw podawany jest operator, a potem argumenty np. + B C ) 23
lgorytmy i Struktury Danych Przykład konwersji Chcemy zamienić wyrażenie w postaci infiksowej na wyrażenie w postaci postfiksowej. Rozpatrzmy takie wyrażenie: + B C D Realizacja konwersji przebiega w następujący sposób: Bieżący odczytany) element wyrażenia w postaci infiksowej Zawartość stosu Wyrażenie w postaci postfiksowej UNIWERSYTET EKONOMICZNY W KRKOWIE + + B + C D B B + B + C B + C B + C D B + C D B + C D 24
Efektem konwersji jest wyrażenie w formie postfiksowej. B + C D Konwersja wyrażeń zawierających nawiasy UNIWERSYTET EKONOMICZNY W KRKOWIE lgorytm konwersji wyrażeń, w których występują nawiasy jest bardzo podobny do zwykłej konwersji. Nawiasy traktowane są w podobny sposób jak operatory. Priorytet nawiasu jest niższy od priorytetu każdego innego operatora. Jeżeli odczytanym elementem wyrażenia zapisanego w postaci infiksowej jest lewy nawias to umieszczamy go na stosie. Jeżeli odczytanym elementem wyrażenia zapisanego w postaci infiksowej jest prawy nawias to ze stosu usuwamy kolejno znajdujące się na nim operatory i dopisujemy je do wyrażenia w postaci postfiksowej. Operacja usuwania operatorów ze stosu jest wykonywana aż do chwili, gdy na wierzchołku stosu znajdzie się lewy nawias. Wówczas odpowiadające sobie nawiasy są usuwane prawy z wyrażenia infiksowego, zaś lewy ze stosu). Przykład konwersji Chcemy zamienić wyrażenie w postaci infiksowej zawierające nawiasy na wyrażenie w postaci postfiksowej. Rozpatrzmy takie wyrażenie: C H) B C) Realizacja konwersji przebiega w następujący sposób: Bieżący odczytany) element wyrażenia w postaci infiksowej Zawartość stosu Wyrażenie w postaci postfiksowej 25
lgorytmy i Struktury Danych C C C H C H UNIWERSYTET EKONOMICZNY W KRKOWIE ) B C C H C H C H C H B C H B C H B C 26
) C H B C C H B C C H B C UNIWERSYTET EKONOMICZNY W KRKOWIE Efektem konwersji jest wyrażenie w formie postfiksowej. C H B C Tablica przejść Podczas konwersji wyrażeń z notacji infiksowej na postfiksową implementacja algorytmu), przydać się może poniższa tabela, tak zwana tablica przejść. bieżący znak argument koniec wyrażenia ) znak na wierzchołku stosu +,, pusty BŁĄD pobierz ze stosu i usuń ")" oraz "" KONIEC BŁĄD połóż na stosie połóż na stosie połóż na stosie połóż na stosie +, połóż na stosie, połóż na stosie połóż na stosie połóż na stosie połóż na stosie 27
lgorytmy i Struktury Danych Sprawdzanie poprawności wyrażeń arytmetycznych UNIWERSYTET EKONOMICZNY W KRKOWIE Konwersja błędnie zapisanego wyrażenia w postaci infiksowej prowadzi do utworzenia błędnego wyrażenia w postaci postfiksowej. Metoda sprawdzająca poprawność wyrażenia analizuje wyłącznie jego postać postfiksową. Przyjmując następujące oznaczenia: s i stałe argumenty) występujące w wyrażeniu postfiksowym, o i operatory występujące w wyrażeniu postfiksowym, definiujemy pojęcie stopnia operatora. Przez stopień operatora rozumiemy liczbę wymaganych przez niego argumentów np. stopień operatora wynosi 2). Każdemu wyrażeniu postfiksowemu przypisujemy współczynnik zwany rangą wyrażenia r). Sposób obliczania rangi wyrażenia to: ranga symbolu s i wynosi 1, ranga operatora o i stopnia n wynosi 1n, ranga ciągu symboli s i i operatorów o i jest równa sumie rang poszczególnych symboli i operatorów. Poniżej proste przykłady obliczania rangi symbolu, operatorów oraz. rs i ) = 1 ranga symbolu r+) = r) = r) = r) = 1 rangi operatorów ra b + c d + ) = ra) + rb) + r+) + rc) + rd) + r+) + r) = 1 + 1 + 1) + 1 + 1 + 1) + 1) = 1 Do sprawdzenia poprawności brakuje nam jeszcze pojęcia głowy właściwej. Łańcuch symboli z = x y składa się z dwóch części: głowy x) i ogonay). Głowa łańcucha jest właściwa jeśli jego ogon nie jest łańcuchem pustym. Przykładowa głowa właściwa dla naszego wyrażenia została zaznaczona kolorem niebieskim. ra b + c d + ) = ra) + rb) + r+) + rc) + rd) + r+) + r) Wyrażenie postfiksowe jest poprawne wtedy i tylko wtedy, gdy ranga tego wyrażenia jest równa 1 i ranga dowolnej głowy właściwej wyrażenia jest większa lub równa 1. Przykłady wyrażeń poprawnych i niepoprawnych. wyrażenie w notacji infiksowej: a b c wyrażenie w notacji postfiksowej: a b c ranga wyrażenia: ra b c ) = ra) + rb) + rc) + r) + r) = 1 + 1 + 1 + 1) + 1) = 1 głowy właściwe: ra) = 1 ra) + rb) = 2 ra) + rb) + rc) = 3 ra) + rb) + rc) + r) = 2 wyrażenie poprawne ranga wyrażenia równa 1 i wszystkie głowy właściwe >= 1) 28
wyrażenie w notacji infiksowej: a + b wyrażenie w notacji postfiksowej: a b + ranga wyrażenia: ra b +) = ra) + rb) + r) + r+) = 1 + 1 + 1) + 1) = 0 wyrażenie niepoprawne ranga wyrażenia równa zero) wyrażenie w notacji infiksowej: a + b c wyrażenie w notacji postfiksowej: a b c + ranga wyrażenia: ra b c +) = ra) + r) + rb) + rc) + r+) = 1 + 1) + 1 + 1 + 1) = 1 głowy właściwe: ra) = 1 ra) + r) = 0 UNIWERSYTET EKONOMICZNY W KRKOWIE wyrażenie niepoprawne jedna z głów właściwych mniejsza od 1) Obliczanie wartości wyrażenia zapisanego w ONP Obliczanie wartości polega na jego analizie od lewej do prawej strony. odczytane argumenty są umieszczane na stosie, po odczytaniu operatora odczytywana jest odpowiednia liczba argumentów, wykonywane jest działanie i wynik umieszczany jest na stosie. Poniżej przedstawione zostały poszczególne kroki obliczania wartości przykładowego wyrażenia. Wyrażenie w postaci infiksowej. 3 + 7) 8 4) Wyrażenie skonwertowane do postaci postfiksowej. 3 7 + 8 4 naliza wyrażenia oraz zawartość stosu na poszczegółnych etapach obliczeń. Końcowy wynik to wartość 40. 7 8 4 4 3 10 10 10 40 29