Algorytmy i Struktury Danych. Liniowe struktury danych. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 1 / 57
Plan Motywacja Abstarkcyjne struktury danych Liniowe struktury danych Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 2 / 57
Plan Motywacja Motto Abstarkcyjne struktury danych Liniowe struktury danych Struktury danych modyfikuja świat, w którym realizowany jest algorytm, usprawniaja działanie, ułatwiaja zrozumienie algorytmu. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 2 / 57
Motywacja 2 0 5 3 4 1 Do tej pory zajmowaliśmy się tylko jednym typem struktur danych: tablicami (jedno-i wielowymiarowymi). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 3 / 57
Motywacja 2 0 5 3 4 1 Do tej pory zajmowaliśmy się tylko jednym typem struktur danych: tablicami (jedno-i wielowymiarowymi). Ich długość się nie zmienia, a zatem jest to statyczna struktura danych. To oznacza, że albo konieczna wielkość tablicy jest znana z góry, albo tracimy ogromna ilość pamięci. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 3 / 57
Motywacja 2 0 5 3 4 1 Do tej pory zajmowaliśmy się tylko jednym typem struktur danych: tablicami (jedno-i wielowymiarowymi). Ich długość się nie zmienia, a zatem jest to statyczna struktura danych. To oznacza, że albo konieczna wielkość tablicy jest znana z góry, albo tracimy ogromna ilość pamięci. W wielu przypadkach chcemy mieć dynamiczna strukturę danych, której długość zmienia się zgodnie z potrzebami. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 3 / 57
Motywacja 2 0 5 3 4 1 3 2 0 5 4 1 Do tej pory zajmowaliśmy się tylko jednym typem struktur danych: tablicami (jedno-i wielowymiarowymi). Ich długość się nie zmienia, a zatem jest to statyczna struktura danych. To oznacza, że albo konieczna wielkość tablicy jest znana z góry, albo tracimy ogromna ilość pamięci. W wielu przypadkach chcemy mieć dynamiczna strukturę danych, której długość zmienia się zgodnie z potrzebami. Z tego też powodu, potrzebujemy struktury, która pozwala na przechowywanie elementów w fizycznie różnym porzadku. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 3 / 57
Struktury danych Struktury danych, sa zaawansowanymi pojemnikami na dane, które gromadza je i układaja w odpowiedni sposób. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 4 / 57
Struktury danych Struktury danych, sa zaawansowanymi pojemnikami na dane, które gromadza je i układaja w odpowiedni sposób. Ich różnorodność jest ogromna, a dla każdej znaleziono wiele zastosowań oraz interesujacych algorytmów. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 4 / 57
Struktury danych Struktury danych, sa zaawansowanymi pojemnikami na dane, które gromadza je i układaja w odpowiedni sposób. Ich różnorodność jest ogromna, a dla każdej znaleziono wiele zastosowań oraz interesujacych algorytmów. Powszechnie spotykane jest używanie struktur danych do przetwarzania informacji zgromadzonych w innych strukturach. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 4 / 57
Struktury danych Struktury danych, sa zaawansowanymi pojemnikami na dane, które gromadza je i układaja w odpowiedni sposób. Ich różnorodność jest ogromna, a dla każdej znaleziono wiele zastosowań oraz interesujacych algorytmów. Powszechnie spotykane jest używanie struktur danych do przetwarzania informacji zgromadzonych w innych strukturach. Struktury danych sa fundamentalnym narzędziem programisty i ich znajomość jest niezbędna. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 4 / 57
programy = algorytmy + struktury danych Uczac się algorytmiki nie wolno zapomnieć o strukturach danych!!! Informatyk szwajcarski, profesor Niklaus Wirth (twórca języka Pascal i Modula-2). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 5 / 57
Abstrakcyjna struktura danych a struktura danych Abstrakcyjna struktura danych (ASD), to zbiór danych elementarnych wraz z dobrze zdefiniowanym na nich zbiorem operacji. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 6 / 57
Abstrakcyjna struktura danych a struktura danych Abstrakcyjna struktura danych (ASD), to zbiór danych elementarnych wraz z dobrze zdefiniowanym na nich zbiorem operacji. Jaka jest różnica pomiędzy struktura danych a abstrakcyjna struktura danych? Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 6 / 57
Abstrakcyjna struktura danych a struktura danych Abstrakcyjna struktura danych (ASD), to zbiór danych elementarnych wraz z dobrze zdefiniowanym na nich zbiorem operacji. Jaka jest różnica pomiędzy struktura danych a abstrakcyjna struktura danych? Struktura danych jest pewna implementacja konkretnej abstrakcyjnej struktury danych przeznaczonej do pracy na konkretnym komputerze (chodzi o jego architekturę) i systemie operacyjnym. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 6 / 57
Abstrakcyjna struktura danych a struktura danych Abstrakcyjna struktura danych (ASD), to zbiór danych elementarnych wraz z dobrze zdefiniowanym na nich zbiorem operacji. Jaka jest różnica pomiędzy struktura danych a abstrakcyjna struktura danych? Struktura danych jest pewna implementacja konkretnej abstrakcyjnej struktury danych przeznaczonej do pracy na konkretnym komputerze (chodzi o jego architekturę) i systemie operacyjnym. Na tym i kolejnych wykładach zostana omówione abstrakcyjne struktury danych wraz z przykładowymi implementacjami. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 6 / 57
Abstarkcyjne struktury danych Liniowe abstrakcyjne struktury danych: Stos Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 7 / 57
Abstarkcyjne struktury danych Liniowe abstrakcyjne struktury danych: Stos Kolejka Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 7 / 57
Abstarkcyjne struktury danych Liniowe abstrakcyjne struktury danych: Stos Kolejka Listy: jednokierunkowe listy niecykliczne, dwukierunkowe listy niecykliczne, jednokierunkowe listy cykliczne (pierścienie jednokierunkowe), dwukierunkowe listy cykliczne (pierścienie dwukierunkowe). Tablice haszujace Drzewiaste struktury danych Drzewa poszukiwań binarnych Kopce Drzewa AVL Drzewa Czerwono-Czarne... Grafy Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 7 / 57
Stos Stos jest struktura liniowo uporzadkowanych danych, z których jedynie ostatni element, zwany wierzchołkiem, jest w danym momencie dostępny. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 8 / 57
Stos Stos jest struktura liniowo uporzadkowanych danych, z których jedynie ostatni element, zwany wierzchołkiem, jest w danym momencie dostępny. W wierzchołku odbywa się dołaczanie nowych elementów, również jedynie wierzchołek można usunać. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 8 / 57
Stos Stos jest struktura liniowo uporzadkowanych danych, z których jedynie ostatni element, zwany wierzchołkiem, jest w danym momencie dostępny. W wierzchołku odbywa się dołaczanie nowych elementów, również jedynie wierzchołek można usunać. Stos jest zatem specjalnym przypadkiem listy jednokierunkowej, a jego cecha charakterystyczna jest to, że dane sa zapisywane i pobierane metoda Last-In-First-Out (LIFO) (pierwszy wchodzi, ostatni wychodzi). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 8 / 57
Stos Stos jest struktura liniowo uporzadkowanych danych, z których jedynie ostatni element, zwany wierzchołkiem, jest w danym momencie dostępny. W wierzchołku odbywa się dołaczanie nowych elementów, również jedynie wierzchołek można usunać. Stos jest zatem specjalnym przypadkiem listy jednokierunkowej, a jego cecha charakterystyczna jest to, że dane sa zapisywane i pobierane metoda Last-In-First-Out (LIFO) (pierwszy wchodzi, ostatni wychodzi). Działanie stosu jest często porównywane do stosu talerzy: nie można usunać talerza znajdujacego się na dnie stosu nie usuwajac wcześniej wszystkich innych. nie można także dodać nowego talerza gdzieś indziej, niż na sama górę. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 8 / 57
Stos - operacje Niech S = (d 1, d 2,..., d n ) oznacza stos, wtedy: Odkładanie elementu na stos: push(s, d) = (d, d 1, d 2,...,d n ) Pobieranie elementu ze stosu: pop(s) = (d 2,..., d n ), o ile n > 1 Pobieranie elementu ze szczytu stosu bez jego usuwania: top(s) = d 1 Sprawdzanie niepustości stosu: empty(s) wtw., gdy n = 0 Pop Push 2 head 0 1 5 null Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 9 / 57
Stos - przykład pusty dno Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 10 / 57
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 11 / 57
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 12 / 57
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 13 / 57
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 14 / 57
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 15 / 57
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 16 / 57
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 17 / 57
Stos - przykład Co tu jest??? Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 18 / 57
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 19 / 57
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 20 / 57
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 21 / 57
Stos - przykład? Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 22 / 57
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 23 / 57
Zastosowanie stosu - Odwrotna notacja polska (ONP) Odwrotna notacja polska (ang. Reverse Polish Notation) jest sposobem zapisu wyrażeń arytmetycznych, w których znak wykonywanej operacji umieszczony jest po operandach (zapis postfiksowy), a nie pomiędzy nimi jak w zapisie algebraicznym (zapis infiksowy). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 24 / 57
Zastosowanie stosu - Odwrotna notacja polska (ONP) Odwrotna notacja polska (ang. Reverse Polish Notation) jest sposobem zapisu wyrażeń arytmetycznych, w których znak wykonywanej operacji umieszczony jest po operandach (zapis postfiksowy), a nie pomiędzy nimi jak w zapisie algebraicznym (zapis infiksowy). ONP nie wymaga używania w wyrażeniach nawiasów, co sprawia, że obliczenia w tej notacji sa bardzo łatwe do przeprowadzania na komputerze. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 24 / 57
Zastosowanie stosu - Odwrotna notacja polska (ONP) Odwrotna notacja polska (ang. Reverse Polish Notation) jest sposobem zapisu wyrażeń arytmetycznych, w których znak wykonywanej operacji umieszczony jest po operandach (zapis postfiksowy), a nie pomiędzy nimi jak w zapisie algebraicznym (zapis infiksowy). ONP nie wymaga używania w wyrażeniach nawiasów, co sprawia, że obliczenia w tej notacji sa bardzo łatwe do przeprowadzania na komputerze. ONP jest powszechnie stosowana w kompilatorach języków wysokiego poziomu (HLL; ang. High Level Language) do obliczania wartości wyrażeń arytmetycznych. Spowodowane jest to prostota obliczeń w porównaniu do zwykłej notacji z nawiasami. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 24 / 57
Zastosowanie stosu - Odwrotna notacja polska (ONP) Odwrotna notacja polska (ang. Reverse Polish Notation) jest sposobem zapisu wyrażeń arytmetycznych, w których znak wykonywanej operacji umieszczony jest po operandach (zapis postfiksowy), a nie pomiędzy nimi jak w zapisie algebraicznym (zapis infiksowy). ONP nie wymaga używania w wyrażeniach nawiasów, co sprawia, że obliczenia w tej notacji sa bardzo łatwe do przeprowadzania na komputerze. ONP jest powszechnie stosowana w kompilatorach języków wysokiego poziomu (HLL; ang. High Level Language) do obliczania wartości wyrażeń arytmetycznych. Spowodowane jest to prostota obliczeń w porównaniu do zwykłej notacji z nawiasami. Algorytm obliczania wartości wyrażenia ONP wykorzystuje stos do składowania wyników pośrednich. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 24 / 57
Zastosowanie stosu - Odwrotna notacja polska (ONP) Odwrotna notacja polska (ang. Reverse Polish Notation) jest sposobem zapisu wyrażeń arytmetycznych, w których znak wykonywanej operacji umieszczony jest po operandach (zapis postfiksowy), a nie pomiędzy nimi jak w zapisie algebraicznym (zapis infiksowy). ONP nie wymaga używania w wyrażeniach nawiasów, co sprawia, że obliczenia w tej notacji sa bardzo łatwe do przeprowadzania na komputerze. ONP jest powszechnie stosowana w kompilatorach języków wysokiego poziomu (HLL; ang. High Level Language) do obliczania wartości wyrażeń arytmetycznych. Spowodowane jest to prostota obliczeń w porównaniu do zwykłej notacji z nawiasami. Algorytm obliczania wartości wyrażenia ONP wykorzystuje stos do składowania wyników pośrednich. Algorytm przekształcania wyrażeń arytmetycznych na ONP wykorzystuje stos do przechowywania operatorów i nawiasów. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 24 / 57
Odwrotna notacja polska - przykłady Notacja normalna ONP 3 + 2 3 2 + 3 + 2 * 5 3 2 5 * + ((2+3)*5-7)/6 2 3 + 5 * 7-6 / 2 * (5 + 2) 2 5 2 + * (7 + 3) * (5-2) ^2 7 3 + 5 2-2 ^* 4 / (3-1) ^(2 * 3) 4 3 1-2 3 * ^/ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 25 / 57
Algorytm obliczania wartości wyrażenia w ONP 1 Analizuj wyrażenie po jednym elemencie (stałej, zmiennej lub ograniczniku). 2 Jeśli element ten jest: 1 stała lub nazwa zmiennej - dopisz go na stos; 2 operatorem - zdejmij ze stosu właściwa dla danego operatora ilość argumentów, wykonaj na nich obliczenia, a uzyskany wynik dopisz na stos; 3 Jeśli badane wyrażenie nie zostało wyczerpane - wróć do punktu pierwszego; 4 Jeśli badane wyrażenie zostało wyczerpane - wartość znajdujaca się na stosie to wynik obliczeń. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 26 / 57
Algorytm obliczania wartości wyrażenia w ONP - przykład Badane wyrażenie: 6 3 / 2 5 + * Krok Wejście Operacja Stos 1 6 6 2 3 63 3 / 6/3 2 4 2 22 5 5 225 6 + 2+5 27 7 * 2*7 14 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 27 / 57
Algorytm obliczania wartości wyrażenia w ONP - przykład Badane wyrażenie: 7 3 + 5 2-2 ^* Krok Wejście Operacja Stos 1 7 7 2 3 7 3 3 + 7+3 10 4 5 10 5 5 2 10 5 2 6-5-2 10 3 7 2 10 3 2 8 ^ 3^2 10 9 9 * 10*9 90 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 28 / 57
Przekształcanie wyrażeń na ONP 1 Analizuj wyrażenie po jednym elemencie (stałej, zmiennej lub ograniczniku). 2 Jeśli element jest stała lub nazwa zmiennej, przekaż go na wyjście. 3 Jeśli element jest operatorem, to: (a) jeśli priorytet badanego operatora jest wyższy od priorytetu operatora zajmujacego szczyt stosu lub jeśli stos jest pusty - dopisz go na stos; (b) jeśli na szczycie stosu znajduje się operator o wyższym lub równym priorytecie - odczytaj ze stosu i prześlij na wyjście wszystkie operatory o priorytecie wyższym badź równym, aż do wystapienia na szczycie stosu operatora o priorytecie niższym od priorytetu operatora nadchodzacego z wejścia; element badany dopisz na stos; 4 Jeśli element jest nawiasem, to: (a) jeśli trafiłeś na nawias otwierajacy, dopisz go na stos; (b) jeśli trafiłeś na nawias zamykajacy: zdejmij wszystkie operatory ze stosu i przekaż je na wyjście, aż do trafienia na nawias otwierajacy; nawiasów nie wypisuj na wyjście. 5 Jeśli badane wyrażenie nie zostało wyczerpane - wróć do punktu pierwszego; 6 Jeśli badane wyrażenie zostało wyczerpane, odczytaj wszystkie operatory ze stosu i przekaż je na wyjście automatu. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 29 / 57
Przekształcanie wyrażeń na ONP Badane wyrażenie: x + 3 z 2 3/k Krok Wejście Stos Wyjście 1 x x 2 + + 3 3 + 3 4 * +* 5 z +* z 6 - - *+ 7 2-2 8 * -* 9 3 -* 3 10 / -/ * 11 k -/ k 12 /- Wyrażenie zapisane w ONP: x3z +23 k/ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 30 / 57
Przekształcanie wyrażeń na ONP Badane wyrażenie: (15 3)ˆ(3+2) 6/3 Krok Wejście Stos Wyjście 1 ( ( 2 15 ( 15 3 - (- 4 3 (- 3 5 ) - 6 ^ ^ 7 ( ^( 8 3 ^( 3 9 + ^(+ 10 2 ^(+ 2 11 ) ^ + 12 * * ^ 13 6 * 6 14 / / * 15 3 / 3/ Wyrażenie zapisane w ONP: 15 3 32+ˆ6 3/ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 31 / 57
Kolejka Kolejka FIFO (First In First Out) jest struktura liniowo uporzadkowanych danych, w której dołaczać nowe dane można jedynie na koniec, a usuwać z poczatku. Procedura usunięcia danych z końca kolejki jest taka sama, jak w przypadku stosu, z ta różnica, że usuwamy dane od poczatku a nie od końca. Działanie na kolejce jest intuicyjnie jasne, gdy skojarzymy ja z kolejka ludzi np. w sklepie. Każdy nowy klient staje na jej końcu, obsługa odbywa się jedynie na poczatku. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 32 / 57
Kolejka - operacje Niech K = (d 1, d 2,...,d n ) oznacza kolejkę, wtedy: Wstawianie elementu do kolejki: enqueuq(k, d)= (d 1, d 2,..., d n, d) Pobieranie elementu z kolejki: dequeuq(k) = (d 2,...,d n ), o ile n > 1 Obsługiwanie pierwszego elementu z kolejki bez jego usuwania : first(k) = d 1 Sprawdzanie niepustości kolejki: empty(k) wtw., gdy n = 0 Pocz atek Kolejki Koniec Kolejki Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 33 / 57
Tablicowa implementacja stosu i kolejki Wykorzystuje tablicę A złożona z n elementów A[i], gdzie n jest maksymalna liczba spodziewanych elementów. Operacje polegaja na manipulacji indeksami tablicy. Operacja wstawiania elementu do stosu - PUSH Operacja usuwania elementu ze stosu - POP Operacja wstawiania elementu do kolejki - Enqueue Operacja usuwania elementu z kolejki - Dequeue Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 34 / 57
Stos - implementacja tablicowa, założenia top[s] numer ostatniego elementu wstawionego do stosu. Stos składa się z elementów S[1],..., S[top[S]]. S[1] jest elementem na dnie stosu. S[top[S]] jest elementem na szczycie stosu. Jeżeli top[s] = 0, to stos jest pusty. Do sprawdzenia, czy stos jest pusty używana jest operacja Stack Empty. Próba zdjęcia elementu ze stosu sygnalizowana jest błędem niedomiaru. Jeżeli top[s] jest większe niż ustalony z góry rozmiar tablicy, to stos jest przepełniony. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 35 / 57
Stos - implementacja tablicowa Push(S, x) 1: if top[s] = length[s] then 2: error przepełnienie 3: end if 4: top[s] = top[s]+1 5: S[top[S]] = x 1 5 2 3 top Kierunek wstawiania Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 36 / 57
Stos - implementacja tablicowa Stack-Empty(S) 1: if top[s] = 0 then 2: return true 3: else 4: return false 5: end if Pop(S) 1: if Stack-Empty(S) then 2: error niedomiar 3: end if 4: top[s] = top[s] 1 5: return S[top[S] + 1] 1 5 2 3 top Kierunek wstawiania Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 37 / 57
Stos - implementacja tablicowa # i n c l u d e < s t d i o. h> # i n c l u d e < s t d l i b. h> # d e fine DLUGOSC_MAX 20 i n t const STOS_PELNY=3; i n t const STOS_PUSTY=2; i n t const OK = 1 ; i n t szczyt =0; i n t Stos [DLUGOSC_MAX+ 1 ] ; i n t push ( i n t x ) ; i n t pop ( i n t w ) ; i n t StanStosu ( ) ; void c l e a r ( ) { szczyt = 0 ; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 38 / 57
Stos - implementacja tablicowa i n t main ( void ) { i n t a, i ; f o r ( i =0; i < DLUGOSC_MAX; i ++ ) push ( i ) ; f o r ( i =0; i < DLUGOSC_MAX; i ++ ) { pop(&a ) ; p r i n t f ("%d, ", a ) ; } r e t u r n 0 ; } i n t StanStosu ( ) { switch ( szczyt ) { case 0 : r e t u r n (STOS_PUSTY) ; case DLUGOSC_MAX+1: r e t u r n (STOS_PELNY ) ; d e f a u l t : r e t u r n (OK) ; } } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 39 / 57
Stos - implementacja tablicowa i n t push ( i n t x ) { i f ( szczyt <=DLUGOSC_MAX) { Stos [ szczyt ++]=x ; r e t u r n (OK) ; } else r e t u r n (STOS_PELNY ) ; } i n t pop ( i n t w) { i f ( szczyt >0){ w=stos[ szczyt ] ; r e t u r n (OK) ; } else r e t u r n (STOS_PUSTY) ; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 40 / 57
Kolejka - implementacja tablicowa n 1 elementowa kolejka jest impelementowana za pomoca n-elementowej tablicy Q, tj. Q = Q[1]...Q[n]. Atrybut head[q] wskazuje na głowę, czyli poczatek kolejki. Atrybut tail[q] wyznacza następna wolna pozycję, na która można wstawić nowy element. Elementy kolejki znjduja się na pozycjach: head[q], head[q]+ 1,...,tail[Q] 1. Zakładmy, że tablica jest cykliczna, tzn. że pozycja o numerze 1 jest bezpośrednim następnikiem pozycji n. Jeżeli head[q] = tail[q],to kolejka jest pusta. Poczatkowo head[q] = tail[q] = 1. Jeżeli kolejka jest pusta, to próba usunięcia jest sygnalizowana błędem niedomiaru. Jeżeli head[q] = tail[q]+1, to kolejka jest pełna. Jeżeli kolejka jest pełna, to próba dodania nowego elementu jest sygnalizowana błędem niedomiaru. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 41 / 57
Kolejka - implementacja tablicowa Dequeue(Q) 1: if head[q] = tail[q] then 2: error Niedomiar 3: end if 4: x = Q[head[Q]] 5: if head[q] = length[q] then 6: head[q] = 1 {Założenie o cykliczności} 7: else 8: head[q] = head[q]+1 9: end if 10: return x 1 5 - - 2 3 0 tail head Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 42 / 57
Kolejka - implementacja tablicowa Enqueue(Q, x) 1: if head[q] = (tail[q]+1) mod length(q) then 2: error Nadmiar 3: end if 4: Q[tail[Q]] = x 5: if tail[q] = length[q] then 6: tail[q] = 1 7: else 8: tail[q] = tail[q]+1 9: end if 1 5 - - 2 3 0 tail head Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 43 / 57
Kolejka - implementacja tablicowa Q Q Q 1 2 3 4 5 6 7 8 9 10 6 9 8 4 head[q]=4 tail[q]=8 1 2 3 4 5 6 7 8 9 10 6 9 8 4 17 3 5 tail[q]=1 head[q]=4 1 2 3 4 5 6 7 8 9 10 6 9 8 4 17 3 5 tail[q]=1 head[q]=5 Enq(Q,17) Enq(Q,3) Enq(Q,5) Deq(Q) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 44 / 57
Kolejka - implementacja tablicowa # i n c l u d e < s t d i o. h> # i n c l u d e < s t d l i b. h> i n t head=0, t a i l =0; # d e fine MaxElt 20 i n t Kolejka [ MaxElt + 1 ] ; void wstaw ( i n t x ) { Kolejka [ t a i l ++]=x ; i f ( t a i l >MaxElt ) t a i l =0; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 45 / 57
Kolejka - implementacja tablicowa i n t obsluz ( i n t w) { i f ( head== t a i l ) r e t u r n 1; w = Kolejka [ head + + ] ; i f ( head>maxelt ) head =0; r e t u r n 1 ; } i n t pusta ( ) { i f ( head== t a i l ) r e t u r n 1 ; else r e t u r n 0 ; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 46 / 57
Kolejka - implementacja tablicowa i n t main ( void ) { f o r ( i n t i =0; i <MaxElt ; i ++) wstaw ( i ) ; i n t s ; f o r ( i n t i =0; i <MaxElt ; i ++) { i n t res = obsluz (&s ) ; i f ( res ==1) p r i n t f ( " Obsluzony z o s t a l k l i e n t : %d \ n ", s ) ; else p r i n t f ( " Kolejka pusta! \ n " ) ; } r e t u r n 0 ; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 47 / 57
Dynamiczna realizacja Stosu i Kolejki # i f n d e f ITEM_H # d e fine ITEM_H typedef s t r u c t ITEM { i n t data ; s t r u c t ITEM next ; } Item ; # e n d i f Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 48 / 57
Dynamiczna realizacja Stosu # i f n d e f STACK_H # d e fine STACK_H # i n c l u d e < stdbool. h> # i n c l u d e " item. h " typedef s t r u c t { Item top ; } Stack ; / / i n i c j a l i z u j e stos void i n i t S t a c k ( Stack s ) ; / / usuwa ze sto su wszystki e elementy void clearstack ( Stack s ) ; / / umieszcza element na s t o s i e void push ( Stack s, i n t w ) ; / / usuwa element ze szczytu sto su void pop ( Stack s ) ; / / pobiera element ze szczytu stosu i n t top ( Stack const s ) ; / / zwraca true, j e z e l i stos pusty bool stackempty ( Stack const s ) ; # e n d i f Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 49 / 57
Dynamiczna realizacja Stosu # i n c l u d e < s t d l i b. h> # i n c l u d e " stack. h " void i n i t S t a c k ( Stack s ) { s >to p = NULL ; } bool stackempty ( Stack const s ) { r e t u r n ( s >top == NULL ) ; } i n t top ( Stack const s ) { r e t u r n s >top >data ; } void clearstack ( Stack s ) { while (! stackempty ( s ) ) pop ( s ) ; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 50 / 57
Dynamiczna realizacja Stosu void push ( Stack s, i n t w) { Item p = malloc ( s i z e o f ( Item ) ) ; p >data = w; p >next = NULL ; } i f ( s >top == NULL) { / / stos pusty s >top = p ; } else { p >next = s >top ; s >top = p ; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 51 / 57
Dynamiczna realizacja Stosu void pop ( Stack s ) { i f ( s >top!= NULL) { Item p = s >top ; s >top = p >next ; f r e e ( p ) ; } } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 52 / 57
Dynamiczna realizacja Kolejki # i f n d e f QUEUE_H # d e fine QUEUE_H # i n c l u d e < stdbool. h> # i n c l u d e " item. h " typedef s t r u c t { Item f i r s t ; Item l a s t ; } Queue ; # e n d i f Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 53 / 57
Dynamiczna realizacja Kolejki # i f n d e f QUEUE_H # d e fine QUEUE_H / / i n i c j a l i z u j e k o l e j k e void initqueue ( Queue ); / / usuwa z k o l e j k i wszystkie elementy void clearqueue ( Queue ) ; / / dodaje element do k o l e j k i void i n j e c t ( Queue, i n t ) ; / / pobiera wartosc pierwszego elementu i n t f r o n t ( Queue const ) ; / / usuwa element z k o l e j k i void e j e c t ( Queue ); / / zwraca true, j e z e l i k o l e j k a pusta bool queueempty ( Queue q ) ; # e n d i f Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 54 / 57
Dynamiczna realizacja Kolejki # i n c l u d e < s t d l i b. h> # i n c l u d e " queue. h " void initqueue ( Queue q ) { q > f i r s t = q >l a s t = NULL ; } bool queueempty ( Queue q ) { r e t u r n ( q. f i r s t == NULL ) ; } i n t f r o n t ( Queue const q ) { r e t u r n q > f i r s t >data ; } void clearqueue ( Queue q ) { while ( q > f i r s t!= NULL) e j e c t ( q ) ; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 55 / 57
Dynamiczna realizacja Kolejki void i n j e c t ( Queue q, i n t w) { Item p = malloc ( s i z e o f ( Item ) ) ; p >data = w; p >next = NULL ; } i f ( q > f i r s t == NULL) { q > f i r s t = q >l a s t = p ; } else { q >l a s t >next = p ; q >l a s t = p ; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 56 / 57
Dynamiczna realizacja Kolejki void e j e c t ( Queue q ) { / / jeden element lub k o l e j k a pusta i f ( q > f i r s t == q >l a s t ) { f r e e ( q > f i r s t ) ; q > f i r s t = q > l a s t = NULL ; } else { Item p = q > f i r s t ; q > f i r s t = p >next ; f r e e ( p ) ; } } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 57 / 57