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