Algorytmy i Struktury Danych. Abstrakcyjne struktury danych dr hab. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 5 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 1 / 47
Plan Motywacja Abstarkcyjne struktury danych Liniowe struktury danych Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 2 / 47
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 5 2 / 47
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 5 3 / 47
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 5 3 / 47
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 5 3 / 47
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 5 3 / 47
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 5 4 / 47
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 5 4 / 47
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 5 4 / 47
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 5 4 / 47
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 5 5 / 47
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 5 6 / 47
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 5 6 / 47
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 5 6 / 47
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 5 6 / 47
Abstarkcyjne struktury danych Liniowe abstrakcyjne struktury danych: Stos Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 7 / 47
Abstarkcyjne struktury danych Liniowe abstrakcyjne struktury danych: Stos Kolejka Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 7 / 47
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 5 7 / 47
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 5 8 / 47
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 5 8 / 47
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 5 8 / 47
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 5 8 / 47
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 5 9 / 47
Stos - przykład pusty dno Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 10 / 47
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 11 / 47
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 12 / 47
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 13 / 47
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 14 / 47
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 15 / 47
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 16 / 47
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 17 / 47
Stos - przykład Co tu jest??? Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 18 / 47
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 19 / 47
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 20 / 47
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 21 / 47
Stos - przykład? Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 22 / 47
Stos - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 23 / 47
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 5 24 / 47
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 5 24 / 47
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 5 24 / 47
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 5 24 / 47
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 5 24 / 47
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 5 25 / 47
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 5 26 / 47
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 5 27 / 47
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 5 28 / 47
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 5 29 / 47
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 5 30 / 47
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 5 31 / 47
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 5 32 / 47
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 5 33 / 47
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 5 34 / 47
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 5 35 / 47
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 5 36 / 47
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 5 37 / 47
Stos - implementacja tablicowa # include <iostream > using namespace std ; i n t co n st 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 5 38 / 47
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 ) ; cout << 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 5 39 / 47
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 5 40 / 47
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 5 41 / 47
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 5 42 / 47
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 5 43 / 47
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 5 44 / 47
Kolejka - implementacja tablicowa # include <iostream > using namespace std ; i n t head=0, t a i l =0; i n t const 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 5 45 / 47
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 ( ) { / / czy k o l e j k a j e s t pusta? i f ( head== t a i l ) r e t u r n 1 ; / / k o l e j k a pusta else r e t u r n 0 ; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 46 / 47
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) cout << " Obsluzony z o s t a l k l i e n t : " << s << endl ; else cout << " Kolejka pusta! " << endl ; ; } r e t u r n 0 ; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 5 47 / 47