1.Wst p 2.Implementacja stosu i drzewa w j zyku ANSI C
Transkrypt
1.Wst p 2.Implementacja stosu i drzewa w j zyku ANSI C
! " ! " # % # '() # & % $ $ % &' $ " ! % $ & &! )$ * .! & $ $ & &$ % $ $ ! $ $ + , & % $ ! +- $ Celem wiczenia jest zapoznanie studenta ze strukturami: lista, stos, drzewo oraz ich implementacja w j zyku ANSI C. Zrozumienie działania tych struktur pozwoli na napisanie programu kalkulatora licz cego w odwrotnej notacji polskiej. /! $ '() # Lista to uporz dkowany ci g elementów. Przykładami list s wektory lub tablice jednowymiarowe. W wektorach mamy dost p do dowolnego elementu, poprzez podanie indeksu tego elementu. Stos jest list z trzema operacjami: • dodawanie elementów na wierzch stosu, • zdejmowanie elementu z wierzchu stosu, • sprawdzanie czy stos jest pusty. Na stosie dodajemy i odejmujemy elementy z samego ko ca. Taka organizacja obsługi listy okre lana jest LIFO (ang. last in first out – ostatni wszedł, pierwszy wyjdzie). opracowała: mgr in . Izabela Skorupska J zyk ANSI C (w systemie LINUX) 1 Struktura reprezentuj ca element stosu: struct stos { char element; struct stos *wskaznik; struct stos *wskaznik; }; Deklaracja elementów stosu: struct stos *nowy, *stary; Procedura realizuj ca dodawanie elementów na stos: void na_stos(char znak) {stary=nowy; nowy= malloc (sizeof(struct stos)); nowy->element=znak; nowy->wskaznik=stary; } Procedura realizuj ca zdejmowanie elementów ze stosu: void ze_stosu(struct stos *wskaz_element) { if (wskaz_element!=NULL) { stary=wskaz_element->wskaznik; //printf("Usunieto %c ", wskaz_element->element); free(wskaz_element); nowy=stary; } } Procedura usuwaj ca wszystkie elementy ze stosu: void oczysc_stos(void) { stary=nowy; while (stary!=NULL) ze_stosu(stary); printf("\nStos oczyszczony."); } Procedura drukuj ca zawarto stosu: void pokaz_stos(void) { printf("Zawartosc stosu \n"); stary=nowy; while (stary!=NULL) { printf(" %c ", stary->element); stary=stary->wskaznik; } } Drzewo jest hierarchiczn struktur danych. Pierwszy element drzewa, zwany korzeniem jest wyró niony. Inne elementy s jego potomstwem lub potomstwem jego potomstwa itd. Elementy opracowała: mgr in . Izabela Skorupska J zyk ANSI C (w systemie LINUX) 2 drzewa nazywa si wierzchołkami lub w złami. Li cie to wierzchołki nie maj ce potomstwa. Drzewa cz sto przedstawia si w formie grafu, gdzie ka dy wierzchołek jest poł czony kraw dzi ze swoim ojcem i ze swoimi dzie mi (swoim potomstwem). Dla ka dego elementu w drzewie istnieje dokładnie jedna cie ka prowadz ca od korzenia do tego wierzchołka. Drzewa binarne to takie drzewa, w których ka dy wierzchołek ma co najwy ej dwóch potomków. Struktura reprezentuj ca drzewo binarne: struct drzewo { char element; struct drzewo *prawy; struct drzewo *lewy; }; Drzewa mog by zrównowa one i niezrównowa one. Drzewo jest zrównowa one, gdy ró nica wysoko ci obu poddrzew ka dego w zła w drzewie wynosi 0 lub 1. Szczególnym przypadkiem drzewa niezrównowa onego jest stos. ! ( $ $ Obliczenia arytmetyczne mo emy zapisywa w notacji infiksowej, prefiksowej (notacja polska) lub postfiksowej (odwrotna notacja polska). Je li dodawanie dwóch liczb a i b zapiszemy w postaci: a + b to mamy do czynienia z notacj infiksow , gdy nazwa funkcji została umieszczona pomi dzy argumentami. W notacji prefiksowej działanie przybiera posta : + a b natomiast odwrotna notacja polska zostala przedstawiona przez polskiego logika J. Łukasiewicza i działanie opisujemy ci giem: a b + Odwrotna notacja polska jest stosowana w nowoczesnych kalkulatorach naukowych, gdy nie trzeba w niej u ywa nawiasów i nie sprawia kłopotów przy wprowadzaniu wielu argumentów. Konwersja bardziej skomplikowanych wyra e przedstawionych w notacji infiksowej do postaci postfiksowej jest kłopotliwa zwłaszcza wtedy, gdy wyra enie oryginalne zawiera wiele zagnie d onych nawiasów. 0!'% () *)+ 1 , $ $ , ! Dla kolejnych zapisów wyra enia: opracowała: mgr in . Izabela Skorupska J zyk ANSI C (w systemie LINUX) 3 • je eli element jest stał lub zmienn , to wkładamy jego warto • je eli element jest znakiem operacji, to: na stos, o zdejmujemy dwie warto ci z wierzchu stosu, o wykonujemy operacj na tych warto ciach, o obliczon warto • wkładamy na wierzch stosu, po przej ciu całego wyra enia jego warto znajduje si na stosie. Przykład 1: Dany jest ci g w notacji postfiksowej: a b c + * d e / + nale y zamieni go w ci g zapisany w notacji infiksowej: Krok 1. Kładziemy elementy a b c na stos Krok 2. Wykonujemy działanie + Krok 3. Wykonujemy działanie * Krok 4. Kładziemy elementy d e na stos Krok 5. Wykonujemy działanie / Krok 6. Wykonujemy działanie + Krok 1 Krok 2 Krok 3 Krok 4 Krok 5 Krok 6 c b a c+b a (c+b)*a e d (c+d)*a e/d (c+d)*a e/d+(c+b)*a W wyniku działania algorytmu otrzymamy wyra enie: e/d+(c+b)*a () -)+ , Dla kolejnych zapisów wyra enia, czytaj c od ko ca wyra enia: • pierwszy element stanowi wierzchołek drzewa, • kolejny element stanowi jego prawego potomka, • je eli wstawiany element jest: o znakiem nale y powtórzy operacj 2, o cyfr lub liter , nale y wróci do najbli szego wierzchołka i sprawdzi czy ma on ju lewego potomka: je li nie ma nale y go utworzy i powtórzy operacje: 2 i 3, je li ma wróci do najbli szego wierzchołka nie posiadaj cego dwóch potomków i powtórzy operacje: 2 i 3. opracowała: mgr in . Izabela Skorupska J zyk ANSI C (w systemie LINUX) 4 Wszystkie operacje wykonujemy do momentu wyczerpania elementów. Przykład 2: Obliczy warto wyra enia: 4 2 3 + * 1 5 - + (metod stosu) Post pujemy zgodnie z opisanym algorytmem: Krok 1 Krok 2 Krok 3 2+3=5 5*4=20 2 3 Krok 4 Krok 5 Krok 6 5-1=4 4+20=24 5 4 4 1 20 20 Przykład 3: Ci g: a b c + * d e / + za pomoc drzewa nale y zamieni w ci g zapisany w notacji infiksowej: Krok 1. Operator „+” stanowi korze drzewa, „/” jego prawego potomka. Poniewa „/” nie jest cyfr ani liter , staje si wierzchołkiem nowej gał zi. Jego prawym li ciem b dzie „e”, które jest liter i nie mo e mie swojego potomka. Nale y wróci do najbli szego wierzchołka („/”) i sprawdzi , czy ma on lewego potomka. W realizowanym przykładzie: „/” go nie ma, wi c b dzie nim „d”. Ten element nie mo e by wierzchołkiem nowej gał zi, dlatego szukamy najbli szego wierzchołka, który nie posiada jeszcze dwóch potomków. Warunek ten spełnia korze drzewa. Krok 2. Tworzymy lewego potomka wierzchołka „+”. Kolejny element ci gu stanowi znak opeacji„*”, zatem mo e by on nowym wierzchołkiem. Krok 3. Post pujemy analogicznie jak w kroku 1. Elementy: „+”, „c”, „b” b d stanowiły jego poddrzewo. opracowała: mgr in . Izabela Skorupska J zyk ANSI C (w systemie LINUX) 5 Krok 4. Analogicznie jak w kroku 2. Tak zbudowane drzewo b dzie miało posta : Odczytywanie i obliczanie warto ci wyra enia rozpoczynamy od najni szego poziomu (poddrzewa) lewego potomka (od strony prawej do lewej) i w drujemy ku górze a do wierzchołka, nast pnie powtarzamy operacj dla prawego potomka. Odczytane wyra enie b dzie miało posta : (c+b)*a+(e/d) Przykład 4: Obliczy warto wyra enia: 4 2 3 + * 1 5 - + (metod drzewa) Tworzymy drzewo: Odczytujemy poszczególne składowe wyniku: opracowała: mgr in . Izabela Skorupska J zyk ANSI C (w systemie LINUX) 6 2! 3$ Zadanie polega na napisaniu: programu kalkulator.c licz cego warto odwrotnej notacji polskiej (notacji postfiksowej). wyra enia podanego w Zało enia programu kalkulator: • program przyjmuje tylko cyfry: 0..9 oraz symbole operacji: * / + - • próba wprowadzenia innej warto ci oraz dzielenia przez zero powinna spowodowa wy wietlenie odpowiedniego komunikatu i przerwanie operacji liczenia. • q • dozwolone s dwa sposoby wykonywania oblicze : oznacza wyj cie z programu o za pomoc stosu, o za pomoc drzewa. 4! * Przykładowe uruchomienie programu kalkulator: Wprowadz liczby: 1 2 3 + Wynik operacji: 4 Wprowadz liczby 1 a + „a” nie jest cyfra ani znakiem operacji. Wprowadz liczby: 0 1 2 + / Dzielenie przez 0. Wprowadz liczby: q Wyjscie z programu 5! )$ Sprawozdanie powinno zawiera nast puj ce elementy: • schemat blokowy działania programu, • skomentowany plik ródłowy, • plik makefile do kompilacji programu, • w przypadku wykonywania oblicze funkcji, • wnioski i uwagi. opracowała: mgr in . Izabela Skorupska J zyk ANSI C (w systemie LINUX) na drzewie dokładny opis utworzonej struktury oraz 7 UWAGA: Program licz cy oparty o operacje wykonywane na drzewie b dzie wy ej punktowany ni program wykorzystuj cy obliczenia na stosie. 5! 6 1. A. Drozdek, D. L. Simon „Struktury danych w j zyku C”, WNT 1996. 2. http://julia.univ.gda.pl/~matszp/book/Md8.pdf 3. http://galaxy.uci.agh.edu.pl/~chwastek/lectures/C/spis.html opracowała: mgr in . Izabela Skorupska J zyk ANSI C (w systemie LINUX) 8