narzędzia |
Odwrotna notacja polskaOdwrotna notacja polska (ang. Reverse Polish Notation, RPN) – jest sposobem 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ń. RPN 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 RPN 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, 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.
[edytuj] Przykłady zapisuPrzykładowy konwencjonalny zapis: (2+3)*5 w RPN wygląda tak: 2 3 + 5 * natomiast: ((2+7)/3+(14-3)*4)/2 zapiszemy następująco: 2 7 + 3 / 14 3 - 4 * + 2 / [edytuj] Algorytm obliczenia wartości wyrażenia RPN
[edytuj] Algorytm konwersji z notacji infiksowej do RPN (rekurencyjny)
[edytuj] Algorytm konwersji z notacji infiksowej do RPNEdsger 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 RPN, 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 nie dodane jeszcze do wyjścia. W uproszczeniu, program czyta po kolei każdą literę i wykonuje operację zależną od tej litery. [edytuj] Szczegóły algorytmu
[edytuj] PrzykładWejś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 "http://pl.wikipedia.org/" Zdejmij "*" ze stosu i dodaj do wyjścia, włóż "http://pl.wikipedia.org/" 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 ^ / + |