Odwrotna notacja polska
Łączność – jedna z własności działań dwuargumentowych, czyli np. operatorów arytmetycznych. Pojęcie to występuje w dwóch znaczeniach.Stos (ang. Stack) – liniowa struktura danych, w której dane dokładane są na wierzch stosu i z wierzchołka stosu są pobierane (bufor typu LIFO, Last In, First Out; ostatni na wejściu, pierwszy na wyjściu). Ideę stosu danych można zilustrować jako stos położonych jedna na drugiej książek – nowy egzemplarz kładzie się na wierzch stosu i z wierzchu stosu zdejmuje się kolejne egzemplarze. Elementy stosu poniżej wierzchołka można wyłącznie obejrzeć, aby je ściągnąć, trzeba najpierw po kolei ściągnąć to, co jest nad nimi.
National Semiconductor (skrót NS lub NSC) – amerykański producent półprzewodników, działający od 1959 do 2011 roku. 23 września 2011 został przejęty przez Texas Instruments za 6,5 miliarda dolarów. Siedziba firmy znajdowała się w Santa Clara w Kalifornii w Stanach Zjednoczonych.
Odwrotna notacja polska (ONP, ang. reverse Polish notation, RPN) – sposób zapisu wyrażeń arytmetycznych, w którym znak wykonywanej operacji umieszczony jest po operandach (zapis postfiksowy), a nie pomiędzy nimi jak w konwencjonalnym zapisie algebraicznym (zapis infiksowy) lub przed operandami jak w zwykłej notacji polskiej (zapis prefiksowy). Zapis ten pozwala na całkowitą rezygnację z użycia nawiasów w wyrażeniach, jako że jednoznacznie określa kolejność wykonywanych działań.
ONP bardzo ułatwia wykonywanie na komputerze obliczeń z nawiasami i zachowaniem kolejności działań. Zarówno algorytm konwersji notacji konwencjonalnej (infiksowej) na odwrotną notację polską (postfiksową), jak i algorytm obliczania wartości wyrażenia danego w ONP są bardzo proste i wykorzystują stos.
Odwrotna notacja polska została opracowana przez australijskiego naukowca Charlesa Hamblina jako „odwrócenie” beznawiasowej notacji polskiej Jana Łukasiewicza na potrzeby zastosowań informatycznych. Hamblin sugerował, aby notację tę nazwać "Azciweisakul notation" (Notacja Azciweisakuł – „Łukasiewicza” pisane od tyłu).
Jest używana w niektórych językach programowania (np. FORTH, Postscript) oraz w niektórych kalkulatorach naukowych (np. Hewlett-Packard czy National Semiconductor). Programy komputerowe kompilujące program dokonują analizy wyrażenia arytmetycznego, przekształcając je na ciąg instrukcji odpowiadający odwrotnej notacji polskiej. Wyrażenie to jest obliczane podczas wykonywania programu.
Przykłady zapisu[ | edytuj kod]
Przykładowy konwencjonalny zapis:
(2+3)×5
w ONP wygląda tak:
2 3 + 5 ×
natomiast:
((2+7)/3+(14−3)×4)/2
zapisuje się następująco:
2 7 + 3 / 14 3 − 4 × + 2 /
Algorytm obliczenia wartości wyrażenia ONP[ | edytuj kod]
Przykład 1[ | edytuj kod]
Wyrażenie w zapisie konwencjonalnym: 12+2×(3×4+10/5) Wyrażenie ONP: 12 2 3 4 × 10 5 / + × + Gdy wczytany element jest liczbą, to zapisuje się ją na stos. W przeciwnym wypadku należy wykonać działanie arytmetyczne na 2 ostatnich liczbach na stosie. Wartość wyrażenia znajduje się na stosie. Wartość wyrażenia (zdejmij ze stosu ostatni element): 40Przykład 2[ | edytuj kod]
Wyrażenie w zapisie konwencjonalnym: (1+2) × 4 + 5 − 3 Wyrażenie ONP: 5 1 2 + 4 × + 3 − Wartość wyrażenia (zdejmij ze stosu ostatni element): 14Algorytm konwersji z notacji infiksowej do ONP[ | edytuj kod]
Edsger Dijkstra wymyślił algorytm nazywany „stacją rozrządową”, ponieważ jest w działaniu bardzo podobny do kolejowej stacji rozrządowej. Tak jak algorytm liczący wartość wyrażenia ONP, ten także działa na bazie stosu. Do konwersji używane są dwie zmienne (typu ciągu znakowego) — wejście oraz wyjście. Jest także stos przechowujący operatory niedodane jeszcze do wyjścia. W uproszczeniu, program czyta po kolei każdą literę i wykonuje operację zależną od tej litery.
Szczegóły algorytmu[ | edytuj kod]
zdejmij o2 ze stosu i dołóż go do kolejki wyjściowej i wykonaj jeszcze raz 1) 2) włóż o1 na stos operatorów.
Przykład[ | edytuj kod]
Wejście 3+4×2/(1−5)^2 Przeczytaj "3" Dodaj "3" do wyjścia Wyjście: 3
Przeczytaj "+" Włóż "+" na stos Wyjście: 3 Stos: +
Przeczytaj "4" Dodaj "4" do wyjścia Wyjście: 3 4 Stos: +
Przeczytaj "×" Włóż "×" na stos Wyjście: 3 4 Stos: + ×
Przeczytaj "2" Dodaj "2" do wyjścia Wyjście: 3 4 2 Stos: + ×
Przeczytaj "/" Zdejmij "×" ze stosu i dodaj do wyjścia, włóż "/" na stos Wyjście: 3 4 2 × Stos: + /
Przeczytaj "(" Włóż "(" na stos Wyjście: 3 4 2 × Stos: + / (
Przeczytaj "1" Dodaj "1" do wyjścia Wyjście: 3 4 2 × 1 Stos: + / (
Przeczytaj "−" Włóż "−" na stos Wyjście: 3 4 2 × 1 Stos: + / ( −
Przeczytaj "5" Dodaj "5" do wyjścia Wyjście: 3 4 2 × 1 5 Stos: + / ( −
Przeczytaj ")" Zdejmij "−" ze stosu i dodaj do wyjścia, zdejmij "(" ze stosu Wyjście: 3 4 2 × 1 5 − Stos: + /
Przeczytaj "^" Włóż "^" na stos Wyjście: 3 4 2 × 1 5 − Stos: + / ^
Przeczytaj "2" Dodaj "2" do wyjścia Wyjście: 3 4 2 × 1 5 − 2 Stos: + / ^
Koniec wyrażenia Zdejmij stos na wyjście Wyjście: 3 4 2 × 1 5 − 2 ^ / +
Zamiana wyrażenia algebraicznego zapisanego w notacji infiksowej na postać postfiksową (ONP)[ | edytuj kod]
Gdy wczytany element jest:
Na koniec, gdy wszystkie elementy zostały wczytane należy zdjąć wszystkie operatory ze stosu i przesłać je na wyjście. Przykład :
Wyrażenie: 12 + a × (b × c + d / e)
ONP: 12 a b c × d e / + × +