• Nie Znaleziono Wyników

1 Przebieg ćwiczenia

N/A
N/A
Protected

Academic year: 2021

Share "1 Przebieg ćwiczenia"

Copied!
8
0
0

Pełen tekst

(1)

Uniwersytet Zielonogórski

Instytut Sterowania i Systemów Informatycznych Ćwiczenie 3 — stos

Laboratorium Metod i Języków Programowania

Celem ćwiczenia jest zapoznanie studentów z najprostszą dynamiczną strukturą danych:

stosem.

1 Przebieg ćwiczenia

Uwaga: Typy danych przechowywanych w dowolnego rodzaju dynamicznych struk- turach danych są oczywiście dowolne (np. liczby całkowite itd. ).

Następujące operacje są wspólne dla większości dynamicznych struktur danych, nie tylko dla stosów:

• Definicja typu strukturalnego

• Obecność wskaźnika głównego na element struktury

• Dodawanie nowego elementu do struktury

• Usuwanie elementu ze struktury

1.1 Definicja typu strukturalnego

Dynamiczne struktury danych składają się z połączonych ze sobą przy pomocy wskaźników zmiennych dynamicznych. Dodatkowo każda zmienna dynamiczna przechowuje dane (co jest podstawowym przeznaczeniem dynamicznej struktury danych). Z tego powodu każda struktura dynamiczna posiada co najmniej:

• Składową przechowującą dane

• Wskaźnik na (następny) element struktury

W bardziej zaawansowanych strukturach takich wskaźników może być więcej, niż jeden.

Definicja typu strukturalnego, służącego do przechowywania liczb typuintw najprostszym przypadku ma zatem postać

s t r u c t T T y p S t r u k t u r a l n y { int D A N E ;

T T y p S t r u k t u r a l n y * N a s t e p n y ; };

(2)

1.2 Tworzenie wskaźnika głównego

Przed rozpoczęciem tworzenia konieczne jest określenie sposobu odwoływania się do dynamicz- nej struktury danych. W tym celu najczęściej wykorzystuje się zwykły wskaźnik do struktury (typuTTypStrukturalny), deklarowany jako zwykła zmienna (niedynamiczna). Wskaźnik taki jest zwykłym wskaźnikiem na typ TTypStrukturalny, dlatego tworzony jest w następujący sposób:

T T y p S t r u k t u r a l n y * W i e r z c h o l e k ;

Należy zauważyć, że wskaźnik ten nie wskazuje na żadne użyteczne dane. Z tego powodu w tym momencie odwołanie się do tego, na co wskazuje ten wskaźnik jest błędne. Zostanie on użyty do utworzenia nowej zmiennej dynamicznej.

Wskaźnik

Śmieci

1.3 Tworzenie elementarnej stuktury:

Każdą tworzoną dynamicznie strukturę należy utworzyć przy pomocy instrukcji

W i e r z c h o l e k = new T T y p S t r u k t u r a l n y ;

NastępnyDANE ??

Wskaźnik

Śmieci

Następnie należy przypisać polom nowoutworzonej struktury dynamicznej określone dane (w przykładzie jest to liczba 1).

W i e r z c h o l e k - > D A N E =1;

NastępnyDANE 1

Wierzcholek

Śmieci

Dodatkowo można również przypisać wskaźnikowiWierzcholek->Nastepny wartośćNULL. Stanowi to dodatkowe zabezpieczenie przed popełnieniem błędu przez programistę podczas dalszego tworzenia dynamicznej struktury danych. W przypadku stosu linia ta nie jest jednak konieczna, gdyż w następnym kroku jego tworzenia wskaźnik ten wskaże na następny element stosu.

W i e r z c h o l e k - > N a s t e p n y = N U L L ;

(3)

NastępnyDANE 1

Wskaźnik

NULL

Jedną z najprostszych w implementacji dynamicznych struktur danych jest stos.

2 Tworzenie stosu

Stos jest dynamiczną strukturą danych, w której dołączanie i usuwanie elementów zachodzi tylko w jednym miejscu: na wierzchołku . Stos można wyobrazić sobie jako stos książek:

chcąc wyjąć jedną, należy wcześniej wyjąć wszystkie znajdujące się powyżej. Wskaźnik główny (Wierzcholek) ma zawsze wskazywać na wierzchołek stosu. Aby usunąć element o wartości w

NastępnyDANE 1 NULL

Wierzcholek

NastępnyDANE 2 NastępnyDANE 3

Dodawanie nowych danych Usuwanie danych

Wskaźnik wskazujący zawsze na wierzchołek stosu

Wartość NULL oznaczająca koniec stosu

Rysunek 1: Gotowy stos

poluDANE równej 2 należy najpierw usunąć wszystkie elementy znajdujące się przed usuwanym elementem (w przykładzie będzie to element o wartości 3 w polu DANE)).

2.1 Tworzenie pierwszego elementu

W i e r z c h o l e k = new T T y p S t r u k t u r a l n y ; W i e r z c h o l e k - > D A N E = 1;

W i e r z c h o l e k - > N a s t e p n y = N U L L ;

To już jest stos, tyle, że nieco mało użyteczny. . . .

NastępnyDANE 1

Wskaźnik

NULL

(4)

2.2 Następne elementy

Od teraz dodawanie każdego nowego elementu będzie przebiegało identycznie:

Najpierw należy utworzyć elementarną ”cegiełkę” — nową zmienną dynamiczną (typu

TTypStrukturalny), która zostanie dodany do stosu. Aby to uczynić niezbędne jest zadekla- rowanie pomocniczego wskaźnika Tmp

T T y p S t r u k t u r a l n y * Tmp ;

Tmp

Śmieci

Przy pomocy wskaźnika Tmptworzona jest nowa zmienna dynamiczna

Tmp = new T T y p S t r u k t u r a l n y ; Tmp - > D A N E = 2;

Tmp - > N a s t e p n y = N U L L ; // To p r z y p i s a n i e w z a s a d z i e nie j e s t // k o n i e c z n e , g d y ż z a r a z Tmp - > N a s t e p n y // z o s t a n i e z m i e n i o n y

NULL

Tmp NastępnyDANE 1

Wierzcholek

NastępnyDANE 2 NULL

Następnie można połączyć tę nową ”cegiełkę” z resztą stosu:

Tmp - > N a s t e p n y = W i e r z c h o l e k ;

NULL

Tmp

NastępnyDANE 1

Wierzcholek

NastępnyDANE 2

Ponieważ w przypadku stosu KONIECZNE jest zapewnienie, aby Wierzcholek wskazywał na rzeczywisty wierzchołek stosu, dlatego należy go przesunąć. Przy tej operacji wystarczy zauważyć, że wskaźnik Tmp wskazuje na wierzchołek stosu.

W i e r z c h o l e k = Tmp ;

(5)

NastępnyDANE 1 NULL

Wierzcholek

NastępnyDANE 2

(Gotowy stos; Zmienna Tmpnie jest już potrzebna i można ją wykorzystać do innych celów)

2.3 Dodawanie nowego elementu do stosu o dwóch elementach

Należy zauważyć, że dodawanie danych do stosu o dowolnym rozmiarze (od pustego stosu aż do utworzenia potrzebnej liczby elementów) przebiega zawsze w ten sam, omówiony w poprzednich podpunktach, sposób:

• utworzenie nowej zmiennej dynamicznej

Tmp = new T t y p S t r u k t u r a l n y ; Tmp - > D A N E = 3;

NastępnyDANE 1 NULL

Tmp

Śmieci

NastępnyDANE 2

NastępnyDANE 3

Wierzcholek

• podpięcie jej na wierzchołek stosu:

Tmp - > N a s t e p n y = W i e r z c h o l e k ;

NastępnyDANE 1 NULL

Tmp

NastępnyDANE 2 NastępnyDANE 3

Wierzcholek

• przeniesienie wskaźnika Wierzcholek na wierzcholek stosu.

W i e r z c h o l e k = Tmp ;

NastępnyDANE 1 NULL

Tmp

NastępnyDANE 2 NastępnyDANE 3

Wierzcholek

(6)

WskaźnikiWierzcholek oraz Tmpwskazują na tę samą zmienną dynamiczną.

NastępnyDANE 1 NULL

Wierzcholek

NastępnyDANE 2 NastępnyDANE 3

Gotowy stos. ZmiennaTmpnie jest już potrzebna i można ją wykorzystać do innych celów. Aby ułatwić sprawdzanie błędów należy jednak ustawić ten wskaźnik na NULL:

Tmp = N U L L ;

Tmp

NULL

Dodawanie pozostałych elementów następuje analogicznie.

3 Usuwanie elementów ze stosu

Przy usuwaniu elementu ze stosu również niezbędne będzie użycie pomocniczego wskaźnikaTmp:

T T y p S t r u k t u r a l n y * Tmp ;

Tmp

Śmieci

Przed usunięciem elementu należy odczytać przechowywaną przez niego (w polu DANE) wartość

— po usunięciu zmiennej dynamicznej nie będzie to możliwe. Jako przykład wykorzystania wartości w tym polu przyjmijmy jego wypisanie na ekranie:

p r i n t f ( " % d " , W i e r z c h o l e k - > D A N E );

Najczęściej usuwanie danych ze stosu realizowanej jest przy pomocy funkcji zwracającej usunię- ty element. Z tego powodu najczęściej wpisuje się Wierzcholek->DANE do zmiennej pomocniczej, której wartość używana jest jako wartość zwracana z funkcji:

int w a r t o s c Z w r a c a n a ; /* . . . */

w a r t o s c Z w r a c a n a = W i e r z c h o l e k - > D A N E ; /* u s u w a n i e e l e m e n t u */

r e t u r n w a r t o s c Z w r a c a n a ;

Przy pomocy zmiennej tymczasowej Tmpnależy przejść na następny element stosu:

Tmp = W i e r z c h o l e k - > N a s t ę p n y ;

(7)

NastępnyDANE 1 NULL

Tmp

NastępnyDANE 2 NastępnyDANE 3

Wierzcholek

Przygotowanie danych do usunięcia.

Zmienna dynamiczna na którą wskazuje wskaźnik Wierzcholek zostanie za chwilę usunięta. Dla ułatwienia sprawdzania błędów można najpierw ustawić wskaźnik Wierzcholek->Następny (na poniższym rysunku oznaczony kolorem czerwonym) na NULL.

UWAGA: PRZED ”odcięciem” zmiennej dynamicznej, na którą wskazuje wskaźnik Wierzcholek

od reszty stosu KONIECZNE jest zapewnienie, że na resztę struktury wskazuje jakiś inny wskaźnik — tutajTmp. Jeśli tak nie będzie, wtedy NIE MA MOŻLIWOŚCI NAPRAWY TEGO BŁĘDU — STRUKTURA ZOSTANIE NIEODWRACALNIE UTRACONA!!!).

W i e r z c h o ł e k - > N a s t ę p n y = N U L L ;

NastępnyDANE 1 NULL

Tmp

NastępnyDANE 2

NastępnyDANE 3

Wierzcholek

NULL

Pojedyncza zmienna dynamiczna, na którą wskazuje wskaźnikWierzcholek została ”odcięta” od reszty stosu. Na pozostałą część stosu wskazuje zmienna Tmp

Teraz można już usunąć element na wierzchołku stosu:

d e l e t e W i e r z c h o l e k ; /* U s u n i ę c i e z m i e n n e j d y n a m i c z n e j , na k t ó r ą w s k a z u j e w s k a ź n i k W i e r z c h o l e k . */

Po wykonaniu tej linii, wskaźnikWierzcholekNIE wskazuje na żaden użyteczny obszar pamięci.

Napisanie więc (*Wierzcholek)lub Wierzcholek->cokolwiek jest BŁĘDNE).

Można jednak oczywiście nadal zmieniać wartość wskaźnika (to, na co ma wskazywać wskaźnik). Poprawne jest więc przypisanie wskaźnikowi Wierzcholek dowolnej wartości (np.

Wierzcholek=NULL). Po wykonaniu instrukcji delete Wierzcholek;wskaźnik Wierzcholek wskazuje na bezużyteczne dane:

Śmieci

NastępnyDANE 1 NULL

Tmp

NastępnyDANE 2

Wierzcholek

(8)

Ponieważ wskaźnik Wierzcholek powinien zawsze wskazywać na wierzchołek stosu, dlatego ko- nieczne jest jego ponowne ustawienie na wierzchołek pozostałej części stosu (na którą aktualnie wskazuje wskaźnikTmp):

W i e r z c h o l e k = Tmp ;

Teraz Wierzcholek znowu wskazuje na użyteczną zmienną dynamiczną - na początek stosu.

Zmienna TMP nie jest już potrzebna i może zostać użyta do innych celów.

NastępnyDANE 1 NULL

Wierzcholek

NastępnyDANE 2

Usuwanie pozostałych elementów realizuje się analogicznie.

4 Zadania

1. Zaimplementować funkcję służącą do dodawania elementów do stosu

2. Zaimplementować funkcję służącą do usuwania elementów stosu. W przypadku próby usunięcia elementu z pustego stosu należy wypisać komunikat o błędzie.

3. Przy pomocy funkcji z p. 1 i 2, dodać do stosu po kolei liczby: 1,3,5,7,9,11,13,15,17,19.

Następnie usunąć wszystkie elementy. Po usunięciu każdego z nich wypisać wartość liczby na ekranie.

Cytaty

Powiązane dokumenty

Aby zmienić dowolny tekst w tym dokumencie, wystarczy kliknąć blok tekstu, który chcesz zaktualizować.. Formatowanie już zostało skonfigurowane

Pamiętajcie jednak, że możecie zostać ocenieni tylko jeśli prawidłowo się podpiszecie korzystając z platformy (imię + pierwsza litera nazwiska lub nazwisko).

W konsekwencji przyjmuje ona na całym rozwa- żanym przedziale [10, 50] największą (a zarazem najmniejszą) wartość π/4 (niewymierną, bo π

Samoocena: dzieci odnoszą się do tego, jak się czuły w czasie tego zajęcia, co było łatwe, a co trudne, jak czuje się nasz niepełnosprawny przyjaciel, wykonując zadania dla

Opis przebiegu zajęć: nauczyciel czyta fragment książki Agaty Battek Wycieczka do jaskini – ilustruje tekst. Dzieci ostatecznie dochodzą do wniosku, że bohaterami książki

Własność ta, powiązana logicznie z kwestią linearności wyrażeń językowych, sprowadza się do tego, że z potoku mowy można wydobywać jednostki dwojakiego rodzaju: po

• Empty(s) : sprawdzenie, czy stos s jest pusty; jest to funkcja logiczna, która zwraca true, jeśli stos s jest pusty, false w.p.p., i nie zmienia struktury stosu..

Pomiar wpływu napięcia zasilania na fwy powinien być wykonany podobnie jak pomiar wpływu napięcia zasilania na Uwy z tym tylko, że zamiast woltomierza w.cz.. Zmieniając