• Nie Znaleziono Wyników

Programowanie i struktury danych Programowanie i struktury danych

N/A
N/A
Protected

Academic year: 2021

Share "Programowanie i struktury danych Programowanie i struktury danych"

Copied!
8
0
0

Pełen tekst

(1)

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>

(2)

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

(3)

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

(4)

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)

(5)

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)

(6)

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

(7)

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 };

(8)

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)

Cytaty

Powiązane dokumenty

Powiemy, że algorytm Alg działający w strukturze danych S jest całkowicie poprawny ze względu na specyfikację &lt;wp,wk&gt; wttw dla wszystkich danych w strukturze S

Problem Dany jest ciąg rosnący e[1],..,e[n] oraz element x pewnej przestrzeni liniowo uporządkowanej &lt;E, &gt;. Następnie porównujemy x z kolejnymi elementami ciągu

(2) za pomocą pary pomocniczych wskaźników pred i succ wybieramy węzeł do przeniesienia i przenosimy go do listy tymczasowej za pomocą wskaźnika mover (aktulizując wskaźniki head

● szablony pozwalają na wielokrotne wykorzystanie istniejącego kodu źródłowego struktury danych dla wielu wersji tej struktury z tym samym interfejsem, ale różnymi typami

● strumienie wejścia/wyjścia: iostream, fstream, sstream, iomanip. ●

(3) przestawiamy wskaźnik next w węźle wskazywanym przez pred (lub wskaźnik head gdy pred jest pusty) oraz wskaźnik prev w węźle wskazywanym przez succ (lub wskaźnik tail gdy

Każda linia w tych plikach zawiera dane pojedynczego studenta rozdzielone pojedynczymi spacjami w następującej kolejności: nazwisko, imię (imiona), numer indeksu

• w przypadku gdy dane osoby są poprawne, a niepoprawny jest jej numer PESEL (czyli nieprawidłowość wystąpiła w pliku pesele.txt), osoba ta nie jest wpisywana do