Minimalna liczba nawiasów przy przekształcaniu wyrażeń z „Odwrotnej Notacji Polskiej” (ONP)
Przykład praktyczny
Weźmy takie wyrażenie zapisane w ONP:
a b c * d e - f ^ / +
No to idziemy po kolei:
a,borazcidzie na stos z priorytetami 5 (dla każdego, czyli na stosie z priorytetami mamy 3 pozycje po 5),- wczytujemy na wejściu mnożenie (*), mamy priorytet 2 (bo mnożenie), wykonujemy więc następujące operacje:
- ściągamy ze stosu
c(czyli to co jest na górze), sprawdzamy czy priorytet na stosie priorytetów (czyli ściągamy tą daną ze stosu) dlacjest mniejszy lub równy (<=) od 2 (dla mnożenia priorytet to 2). W tym przypadku mamy fałsz czyli nic nie robimy, - ściągamy ze stosu element
b(element, który jest na samej górze), sprawdzamy czy priorytet na stosie priorytetów (czyli ściągamy tą daną ze stosu) dla b jest mniejszy (<) od 2 (dla mnożenia priorytet to 2). W tym przypadku mamy fałsz czyli nic nie robimy.
- ściągamy ze stosu
- na stos wrzucamy
b*c([drugi pobrany element] + [działanie arytmetyczne, które wczytaliśmy] + [pierwszy pobrany element]), natomiast na stos priorytetów wędruje 2 – ze względu na mnożenie, dorazeidzie na stos z priorytetami 5,- wczytujemy na wejściu minus (-), mamy priorytet 1 (bo odejmowanie), wykonujemy więc następujące operacje:
- ściągamy ze stosu
e(czyli to co jest na górze), sprawdzamy czy priorytet na sosie priorytetów (czyli ściągamy tą daną ze stosu) dlaejest mniejszy lub równy (<=) od 1 (dla odejmowania priorytet to 1). No i analogicznie jak wyżej mamy fałsz więc nic nie robimy, - ściągamy ze stosu element
d(element, który jest na samej górze), sprawdzamy czy priorytet na stosie priorytetów (czyli ściągamy tą daną ze stosu) dladjest mniejszy (<) od 1 (dla odejmowania priorytet to 1). Znowu analogicznie mamy fałsz czyli po prostu nic nie robimy.
- ściągamy ze stosu
- na stos wrzucamy
d-e([drugi pobrany element] + [działanie arytmetyczne, które wczytaliśmy] + [pierwszy pobrany element]), natomiast na stos priorytetów wędruje 1 – ze względu na odejmowanie, - na stos idzie
fz priorytetem 5, - wczytujemy na wejściu potęgowanie (^), mamy priorytet 3 (bo potęgowanie), wykonujemy więc następujące operacje:
- ściągamy ze stosu f (czyli to co jest na górze), sprawdzamy czy priorytet na sosie priorytetów (czyli ściągamy tą daną ze stosu) dla
fjest mniejszy lub równy (<=) od 3 (dla potęgowania priorytet to 3). No i analogicznie jak wyżej mamy fałsz więc nic nie robimy, - ściągamy ze stosu
d-e(czyli to co jest na górze), sprawdzamy czy priorytet na stosie priorytetów (czyli ściągamy tą daną ze stosu) dlad-ejest mniejszy (<) od 3. I tutaj uwaga: mamy coś takiego 1<3 czyli „prawdę”! Bierzemy więc w nawiasd-e:(d-e).
- ściągamy ze stosu f (czyli to co jest na górze), sprawdzamy czy priorytet na sosie priorytetów (czyli ściągamy tą daną ze stosu) dla
- na stos wrzucamy
(d-e)^f([drugi pobrany element] + [działanie arytmetyczne, które wczytaliśmy] + [pierwszy pobrany element]), natomiast na stos priorytetów wędruje 3 – ze względu na potęgowanie, - wczytujemy na wejściu dzielenie (/), mamy priorytet 2 (bo dzielenie), wykonujemy więc następujące operacje:
- ściągamy ze stosu
(d-e)^f(czyli to co jest na górze), sprawdzamy czy priorytet na sosie priorytetów (czyli ściągamy tą daną ze stosu) dla(d-e)^fjest mniejszy lub równy (<=) od 2 (dla dzielenia priorytet to 2). No i analogicznie jak wyżej mamy fałsz więc nic nie robimy, - ściągamy ze stosu
b*c(czyli to co jest na górze), sprawdzamy czy priorytet na stosie priorytetów (czyli ściągamy tą daną ze stosu) dlad-b*cjest mniejszy (<) od 2. Mamy 2 < 2 więc fałsz.
- ściągamy ze stosu
- na stos wrzucamy
b*c/(d-e)^f([drugi pobrany element] + [działanie arytmetyczne, które wczytaliśmy] + [pierwszy pobrany element]), natomiast na stos priorytetów wędruje 2 – ze względu na dzielenie, - wczytujemy na wejściu dodawanie (+), mamy priorytet 1 (bo dodawanie), wykonujemy więc następujące operacje:
- ściągamy ze stosu
b*c/(d-e)^f(czyli to co jest na górze), sprawdzamy czy priorytet na stosie priorytetów (czyli ściągamy tą daną ze stosu) dlab*c/(d-e)^fjest mniejszy lub równy (<=) od 1 (dla dodawania priorytet to 1). No i analogicznie jak wyżej mamy fałsz więc nic nie robimy, - ściągamy ze stosu a (czyli to co jest na górze), sprawdzamy czy priorytet na stosie priorytetów (czyli ściągamy tą daną ze stosu) dla
ajest mniejszy (<) od 1. Mamy 5 < 1 więc fałsz.
- ściągamy ze stosu
- na stos wrzucamy
a+b*c/(d-e)^fi kończymy wykonywanie programu.
Nasz wynik przy minimalnej liczbie nawiasów:
a+b*c/(d-e)^f