Programowanie i struktury danych Programowanie i struktury danych
Wykład 3 Wykład 3
Dr Piotr Cybula <piotr.cybula@wmii.uni.lodz.pl>
Dr Piotr Cybula <piotr.cybula@wmii.uni.lodz.pl>
Abstrakcyjny typ danych Abstrakcyjny typ danych
● formalny opis własności danych oraz operacji na nich bez wnikania w szczegóły implementacyjne (ang. Abstract Data Type, ADT)
● specyfikacja ADT zawiera:
● określenie charakteru i dziedziny przechowywanych danych
● założenia dotyczące zależności między danymi, np. liczności, uporządkowania, powiązania, itp.
● zestaw możliwych operacji z określeniem:
– nazwy
– parametrów
– wyniku
– warunków początkowych
– stanu końcowego
Abstrakcyjny typ danych Abstrakcyjny typ danych
● pojemność ADT może być:
● ograniczona:
– ustalona statycznie w definicji typu (fixed)
– ustalona dynamicznie dla każdej instancji typu (bounded)
● nieograniczona (unbounded)
● implementacja ADT może korzystać z:
● ciągłego przydziału pamięci, np. tablic:
– zalety: łatwa implementacja, wysoka wydajność operacji
– wady: niska skalowalność, nieoptymalne zużycie pamięci
● nieciągłego przydziału pamięci, np. struktur łączonych:
– zalety: wysoka skalowalność, optymalne zużycie pamięci
Stos (ang. stack) Stos (ang. stack)
● abstrakcyjny typ danych zakładający odwróconą kolejność dostępu do danych
«Last In, First Out» (LIFO)
● podstawowe operacje:
● wstawienie elementu na stos (push), operacja możliwa gdy stos nie jest zapełniony (dotyczy typu o ograniczonym rozmiarze)
● zdjęcie elementu ze stosu (pop), operacja możliwa gdy stos nie jest pusty
● odczyt elementu znajdującego się na szczycie stosu (top), operacja możliwa gdy stos nie jest pusty
● odczyt liczby elementów stosu (size)
● wyczyszczenie stosu (clear)
● sprawdzenie pustości stosu (empty)
Kolejka (ang. queue) Kolejka (ang. queue)
● abstrakcyjny typ danych zakładający chronologiczną kolejność dostępu do danych «First In, First Out» (FIFO)
● podstawowe operacje:
● wstawienie elementu do kolejki (push, enqueue), operacja możliwa gdy kolejka nie jest zapełniona (dotyczy typu o ograniczonym rozmiarze)
● pobranie elementu ze kolejki (pop, dequeue), operacja możliwa gdy kolejka nie jest pusta
● odczyt elementu znajdującego się na początku/końcu kolejki (front, back), operacja możliwa gdy kolejka nie jest pusta
● odczyt liczby elementów kolejki (size)
● wyczyszczenie kolejki (clear)
● sprawdzenie pustości kolejki (empty)
Specyfikacja operacji ADT Specyfikacja operacji ADT
● intuicyjna nazwa operacji
● kolejność, typy i znaczenie argumentów operacji
● warunki wykonania operacji (preconditions):
● dotyczące stanu struktury, np. gdy nie jest pusta, gdy nie jest pełna, gdy zawiera już podany element, gdy nie znaleziono podanego elementu, itp.
● dotyczące argumentów, np. zakresu wartości, wzajemnej zależności między argumentami, itp.
● opcjonalnie wyjątki zgłaszane w przypadku złamania warunków (jednoznaczne komunikaty o przyczynach zgłoszenia wyjątków)
● stan końcowy struktury po operacji (postconditions), w szczególności czym różni się od stanu sprzed wykonania operacji
● opcjonalnie typ i znaczenie wyniku operacji
Projektowanie przez kontrakt Projektowanie przez kontrakt
class Stack
{ //struktura wewnętrzna
public: //interfejs publiczny void push(int);
//pre: stos nie jest pełny
//post: argument jest na szczycie stosu // rozmiar stosu zwiększony o 1 int pop();
//pre: stos nie jest pusty
//post: wartość ze szczytu stosu jest usuwana // rozmiar stosu zmniejszony o 1
//return: wartość ze szczytu stosu void clear();
//pre: brak
//post: stos jest pusty };
Implementacja tablicowa Implementacja tablicowa
● ustalony rozmiar (tablica statyczna):
● domyślne konstruktory, destruktor i operator przypisania
● ograniczony rozmiar (tablica tworzona dynamicznie):
● konstruktor przyjmujący rozmiar (przydział pamięci)
● destruktor (zwolnienie pamięci)
● konstruktor kopiujący (przydział pamięci)
● operator przypisania (zwolnienie starej i przydział nowej pamięci)
● nieograniczony rozmiar (tablica zmieniana dynamicznie):
● konstruktor bezparametrowy (ewentualny przydział pamięci)
● destruktor, konstruktor kopiujący i operator przypisania (jak wyżej)
● dodawanie/usuwanie (zmiana przydziału pamięci)