N IW ERSYTETKONOM IC ZNYWRAKOW IE Odwrotna Notacja Polska
Transkrypt
N IW ERSYTETKONOM IC ZNYWRAKOW IE Odwrotna Notacja Polska
Odwrotna Notacja Polska 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). Aktualnie stosuje się dwie notacje zapisu wyrażeń*: infiksowa (wrostkowa): argument1 - operator - argument2 postfiksowa (przyrostkowa): argument1 - argument2 - operator UNIWERSYTET EKONOMICZNY W KRAKOWIE Poniższa tabela przedstawia przykładowe zapisy w obu notacjach. Notacja infiksowa Notacja postfiksowa A + B A 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. Algorytm 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 pono-wna 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. / A + B C ) 23 Algorytmy i Struktury Danych Przykład konwersji Chcemy zamienić wyrażenie w postaci infiksowej na wyrażenie w postaci postfiksowej. Rozpatrzmy takie wyrażenie: A + B - C * D Realizacja konwersji przebiega w następujący sposób: UNIWERSYTET EKONOMICZNY W KRAKOWIE Bieżący (odczytany) element wyrażenia w postaci infiksowej Zawartość stosu Wyrażenie w postaci postfiksowej A A + A + B A B + - A B + - C A B + C - * * A B + C - D * A B + C D - A B + C D * - A B + C D * - 24 Odwrotna Notacja Polska Efektem konwersji jest wyrażenie w formie postfiksowej. A B + C D * - Konwersja wyrażeń zawierających nawiasy UNIWERSYTET EKONOMICZNY W KRAKOWIE Algorytm 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: A - (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 A A - A - ( ( A - 25 Algorytmy i Struktury Danych C ( A C - - ( A C - H ( A C H UNIWERSYTET EKONOMICZNY W KRAKOWIE - ) ( A C H - - / / A C H - - ( ( / A C H - - B ( / A C H - B * * ( / A C H - B * C ( / - 26 A C H - B C Odwrotna Notacja Polska ( ) / A C H - B C * - A C H - B C * / - Efektem konwersji jest wyrażenie w formie postfiksowej. A 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ść. znak na wierzchołku stosu bieżący znak UNIWERSYTET EKONOMICZNY W KRAKOWIE A C H - B C * / - ( +, - *, / pusty argument przesuń do wyrażenia postfiksowego przesuń do wyrażenia postfiksowego przesuń do wyrażenia postfiksowego przesuń do wyrażenia postfiksowego koniec wyrażenia BŁĄD pobierz ze stosu i dołącz pobierz ze stosu i dołącz pobrany znak do pobrany znak do wyrażenia postfiksowego wyrażenia postfiksowego KONIEC ) pobierz ze stosu i usuń ")" oraz "(" pobierz ze stosu i dołącz pobierz ze stosu i dołącz pobrany znak do pobrany znak do wyrażenia postfiksowego wyrażenia postfiksowego BŁĄD ( połóż na stosie +, - połóż na stosie *, / połóż na stosie połóż na stosie połóż na stosie połóż na stosie pobierz ze stosu i dołącz pobierz ze stosu i dołącz pobrany znak do pobrany znak do wyrażenia postfiksowego wyrażenia postfiksowego połóż na stosie pobierz ze stosu i dołącz pobrany znak do wyrażenia postfiksowego połóż na stosie połóż na stosie 27 Algorytmy i Struktury Danych Sprawdzanie poprawności wyrażeń arytmetycznych 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: si - stałe (argumenty) występujące w wyrażeniu postfiksowym, oi - 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: UNIWERSYTET EKONOMICZNY W KRAKOWIE ranga symbolu si wynosi 1, ranga operatora oi stopnia n wynosi 1-n, ranga ciągu symboli si i operatorów oi jest równa sumie rang poszczególnych symboli i operatorów. Poniżej proste przykłady obliczania rangi symbolu, operatorów oraz wyrażenia postfiksowego. r(si) = 1 // ranga symbolu r(+) = r(-) = r(*) = r(/) = -1 // rangi operatorów r(a b + c d + /) = r(a) + r(b) + r(+) + r(c) + r(d) + r(+) + r(/) = 1 + 1 + (-1) + 1 + 1 + (-1) + (-1) = 1 Do sprawdzenia poprawności wyrażenia postfiksowego 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 ogona(y). 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. r(a b + c d + /) = r(a) + r(b) + r(+) + r(c) + r(d) + 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: r(a b c * -) = r(a) + r(b) + r(c) + r(*) + r(-) = 1 + 1 + 1 + (-1) + (-1) = 1 głowy właściwe: r(a) = 1 r(a) + r(b) = 2 r(a) + r(b) + r(c) = 3 r(a) + r(b) + r(c) + r(*) = 2 wyrażenie poprawne (ranga wyrażenia równa 1 i wszystkie głowy właściwe >= 1) 28 Odwrotna Notacja Polska wyrażenie w notacji infiksowej: a + * b wyrażenie w notacji postfiksowej: a b * + ranga wyrażenia: r(a b * +) = r(a) + r(b) + r(*) + r(+) = 1 + 1 + (-1) + (-1) = 0 wyrażenie niepoprawne (ranga wyrażenia równa zero) UNIWERSYTET EKONOMICZNY W KRAKOWIE wyrażenie w notacji infiksowej: a * + b c wyrażenie w notacji postfiksowej: a * b c + ranga wyrażenia: r(a * b c +) = r(a) + r(*) + r(b) + r(c) + r(+) = 1 + (-1) + 1 + 1 + (-1) = 1 głowy właściwe: r(a) = 1 r(a) + r(*) = 0 wyrażenie niepoprawne (jedna z głów właściwych mniejsza od 1) Obliczanie wartości wyrażenia zapisanego w ONP Obliczanie wartości wyrażenia postfiksowego 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 - * Analiza wyrażenia oraz zawartość stosu na poszczegółnych etapach obliczeń. 4 7 3 10 8 4 10 10 40 Końcowy wynik to wartość 40. 29