Lista 13 (24 stycznia 2006): 11 punktów.
Argumenty wywołania programu i dynamiczne struktury danych.
- (11 punktów)
Napisz program, który przekształci wyrażenie infiksowe z nawiasami
do postfiksowej postaci Łukasiewicza (odwrotna notacja polska).
Wyrażenie infiksowe ma być podane jako argument wywołania programu.
Wyrażenie infiksowe nie może zawierać w środku żadnej spacji.
Postfiksowa postać wyrażenia powinna być przechowywana w kolejce.
Program powinien wypisać podane wyrażenie infiksowe w postaci
postfiksowej (poszczególne elementy tego wyrażenia mają być
pooddzielane pojedynczymi spacjami), a potem obliczyć i wypisać
wartość tego wyrażenia.
Wyrażenie infiksowe jest wyrażeniem arytmetycznym
w naturalnej (dla przeciętnego człowieka) postaci.
Składa się ono z liczb rzeczywistych połączonych operatorami
i pogrupowanych przy pomocy nawiasów.
Nawiasy służą do zmiany kolejności obliczeń wynikającej
z priorytetów użytych operatorów.
Dla uproszczenia przyjmiemy, że wszystkie operatory są binarne
(nie ma unarnego operatora minus, zmieniającego znak
wyrażenia na przeciwny): mamy więc dodawanie (symbol +),
odejmowanie (symbol -), mnożenie (symbol *)
i dzielenie (symbol /).
Priorytety dodawania i odejmowania są niższe niż mnożenia
i dzielenia (najpierw mnożymy i dzielimy, a potem dodajemy
i odejmujemy); ponadto dodawanie ma taki sam priorytet jak
odejmowanie, a mnożenie taki sam jak dzielenie (ciąg obliczeń
o takim samym priorytecie wykonujemy od strony lewej do prawej).
Co do liczb, to są dopuszczalne tylko nieujemne liczby rzeczywiste
(aby dostać wartość o przeciwnym znaku należy ją odjąć od zera),
w których ewentualna część ułamkowa jest zapisywana po kropce
dziesiętnej.
Wyrażenie postfiksowe jest sposobem zapisu wyrażeń
arytmetycznych, w którym symbol operatora operacji umieszczony jest
po operandach, a nie pomiędzy nimi jak w konwencjonalnym zapisie
algebraicznym.
Zapis ten pozwala na całkowitą rezygnację z użycia nawiasów
w wyrażeniach, jako że jednoznacznie określa kolejność wykonywanych
działań.
Wskazówka:
Do przekształcenia wyrażenia infiksowego na postfiksowe (odwrotna
notacja polska) użyj dynamicznych struktur danych (stosy i kolejki)
zrealizowanych na listach.
Wskazówka:
Algorytm translacji wyrażenia arytmetycznego do postaci ONP jest
następujący:
- Przygotuj struktury danych: kolejkę, w której umieść
kolejne symbole wyrażenia infiksowego (wejście); pomocniczy stos,
początkowo pusty; pustą kolejkę na wyrażenie w postaci
postfiksowej (wyjście).
- pobierz symbol z kolejki wejściowej;
- jeśli jest to operand (liczba), to dopisz go do kolejki
wyjściowej;
- jeśli jest to nawias otwierający (, to przepisz go na
stos;
- jeśli jest to nawias zamykający), to przepisz ze
stosu do kolejki wyjściowej wszystkie symbole do nawiasu
otwierającego i usuń ten nawias ze stosu (bez przepisywania go do
kolejki wyjściowej;
- jeśli jest to operator działania algebraicznego, to przepisz
ze stosu do kolejki wyjściowej wszystkie operatory, które mają
wyższy lub równy priorytet (jeśli priorytet operatora na wierzchu
stosu jest mniejszy lub na stosie jest symbol nawiasu
otwierającego lub stos jest pusty, to zakończ przepisywanie);
- jeśli w kolejce wejściowej są jeszcze jakieś symbole, to
przejdź do punktu 2;
- przepisz wszystkie operatory ze stosu do kolejki
wyjściowej.
Uwaga:
Twój program powinien wyłapać ewentualne błędy w podanym do programu
wyrażeniu.
Uwaga:
Opis algorytmu konwersji wyrażenia z postaci konwencjonalnej do
postaci ONP oraz algorytm obliczenia wartości wyrażenia zapisanego
w postaci ONP można znaleźć na stronie
Wikipedii.
|