Algorytmy i Struktury Danych. Liniowe struktury danych. Bożena Woźna-Szcześniak [email protected] 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 Abstarkcyjne struktury danych Liniowe struktury danych Motto 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 sie˛ 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 sie˛ tylko jednym typem struktur danych: tablicami (jedno-i wielowymiarowymi). Ich długość sie˛ 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ść pamieci. ˛ 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 sie˛ tylko jednym typem struktur danych: tablicami (jedno-i wielowymiarowymi). Ich długość sie˛ 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ść pamieci. ˛ W wielu przypadkach chcemy mieć dynamiczna˛ strukture˛ danych, której długość zmienia sie˛ zgodnie z potrzebami. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 3 / 57 Motywacja 3 2 0 5 3 4 2 1 4 5 1 0 Do tej pory zajmowaliśmy sie˛ tylko jednym typem struktur danych: tablicami (jedno-i wielowymiarowymi). Ich długość sie˛ 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ść pamieci. ˛ W wielu przypadkach chcemy mieć dynamiczna˛ strukture˛ danych, której długość zmienia sie˛ 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˛edziem programisty i ich znajomość jest niezbedna. ˛ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 4 / 57 programy = algorytmy + struktury danych Uczac ˛ sie˛ algorytmiki nie wolno zapomnieć o strukturach danych !!! Informatyk szwajcarski, profesor Niklaus Wirth (twórca jezyka ˛ 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 pomiedzy ˛ 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 pomiedzy ˛ struktura˛ danych a abstrakcyjna˛ struktura danych? Struktura danych jest pewna˛ implementacja˛ konkretnej abstrakcyjnej struktury danych przeznaczonej do pracy na konkretnym komputerze (chodzi o jego architekture) ˛ 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 pomiedzy ˛ struktura˛ danych a abstrakcyjna˛ struktura danych? Struktura danych jest pewna˛ implementacja˛ konkretnej abstrakcyjnej struktury danych przeznaczonej do pracy na konkretnym komputerze (chodzi o jego architekture) ˛ 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 dostepny. ˛ 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 dostepny. ˛ W wierzchołku odbywa sie˛ 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 dostepny. ˛ W wierzchołku odbywa sie˛ 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 dostepny. ˛ W wierzchołku odbywa sie˛ 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˛esto porównywane do stosu talerzy: nie można usunać ˛ talerza znajdujacego ˛ sie˛ na dnie stosu nie usuwajac ˛ wcześniej wszystkich innych. nie można także dodać nowego talerza gdzieś indziej, niż na sama˛ góre. ˛ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 8 / 57 Stos - operacje Niech S = (d1 , d2 , . . . , dn ) oznacza stos, wtedy: Pop Push Odkładanie elementu na stos: push(S, d ) = (d , d1 , d2 , . . . , dn ) 2 Pobieranie elementu ze stosu: pop(S) = (d2 , . . . , dn ), o ile n > 1 0 Pobieranie elementu ze szczytu stosu bez jego usuwania: top(S) = d1 1 Sprawdzanie niepustości stosu: empty(S) wtw., gdy n = 0 5 head null Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 9 / 57 Stos 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 Stos !"#$% Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 17 / 57 Stos - przykład Stos 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 pomiedzy ˛ 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 pomiedzy ˛ 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 pomiedzy ˛ 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 jezykó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 pomiedzy ˛ 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 jezykó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 pomiedzy ˛ 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 jezykó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 3+2 3+2*5 ((2+3)*5-7)/6 2 * (5 + 2) (7 + 3) * (5 - 2) ^2 4 / (3 - 1) ^(2 * 3) Bożena Woźna-Szcześniak (AJD) ONP 32+ 325*+ 23+5*7-6/ 252+* 7 3 + 5 2 - 2 ^* 4 3 1 - 2 3 * ^/ Algorytmy i Struktury Danych. Wykład 4 25 / 57 Algorytm obliczania wartości wyrażenia w ONP 1 2 Analizuj wyrażenie po jednym elemencie (stałej, zmiennej lub ograniczniku). Jeśli element ten jest: 1 2 stała˛ lub nazwa˛ zmiennej - dopisz go na stos; 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 ˛ sie˛ 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 1 2 3 4 5 6 7 Bożena Woźna-Szcześniak (AJD) Wejście 6 3 / 2 5 + * Operacja 6/3 2+5 2*7 Algorytmy i Struktury Danych. Stos 6 63 2 22 225 27 14 Wykład 4 27 / 57 Algorytm obliczania wartości wyrażenia w ONP przykład Badane wyrażenie: 7 3 + 5 2 - 2 ^* Krok 1 2 3 4 5 6 7 8 9 Bożena Woźna-Szcześniak (AJD) Wejście 7 3 + 5 2 2 ^ * Operacja 7+3 5-2 3^2 10*9 Algorytmy i Struktury Danych. Stos 7 7 3 10 10 5 10 5 2 10 3 10 3 2 10 9 90 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 sie˛ 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 1 2 3 4 5 6 7 8 9 10 11 12 Wejście x + 3 * z 2 * 3 / k Stos + + +* +* -* -* -/ -/ Bożena Woźna-Szcześniak (AJD) Wyjście x 3 z *+ 2 Wyrażenie zapisane w ONP: x3z ∗ +23 ∗ k/− 3 * k /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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Wejście ( 15 3 ) ^ ( 3 + 2 ) * 6 / 3 Stos ( ( ((^ ^( ^( ^(+ ^(+ ^ * * / / Bożena Woźna-Szcześniak (AJD) Wyjście 15 3 - 3 Wyrażenie zapisane w ONP: 15 3 − 32 + ˆ6 ∗ 3/ 2 + ^ 6 * 3/ 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 usuniecia ˛ 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 sie˛ jedynie na poczatku. ˛ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 32 / 57 Kolejka - operacje Niech K = (d1 , d2 , . . . , dn ) oznacza kolejk˛e, wtedy: Wstawianie elementu do kolejki: enqueuq(K , d ) = (d1 , d2 , . . . , dn , d ) Pocza̧tek Kolejki Pobieranie elementu z kolejki: dequeuq(K ) = (d2 , . . . , dn ), o ile n>1 Obsługiwanie pierwszego elementu z kolejki bez jego usuwania : first(K ) = d1 Koniec Kolejki Sprawdzanie niepustości kolejki: empty(K ) wtw., gdy n = 0 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 33 / 57 Tablicowa implementacja stosu i kolejki Wykorzystuje tablice˛ 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 sie˛ 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 zdjecia ˛ elementu ze stosu sygnalizowana jest błedem ˛ niedomiaru. Jeżeli top[S] jest wieksze ˛ 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 Stos – implementacja tablicowa 1: 2: 3: 4: 5: Push(S, x) Push(S, x) if top[S] = length[S] [S] = length[S] 1. if topthen 1 error “przepełnienie” 2. then error “ !"# #$%&#%&#” 3. top[S] top[S] + 1 end if 4. +S1 [top[S]] x top[S] = top[S] S[top[S]] = x Pop S 1. if Stack-Empty(S then error “niedomiar” 3. else top S top S 4. return S top S ( 5 2 3 Kierunek wstawiania top ) ) 2. [ ] [ Bożena Woźna-Szcześniak (AJD) 2010-02-16 [ ] – 1 [ ] +1] Algorytmy i Struktury Danych. Stack-Empty S 1. if top S then return true 3. else return false ( ) [ ] = 0 2. Wykład 4 6136 / 57 Stos - implementacja tablicowa 1: 2: 3: 4: 5: 1: 2: 3: 4: 5: Stack-Empty(S) if top[S] = 0 then return true else Push(S, x) return false 1. if top[S] = length[S] 1 end if 2. then error “ !"# #$%&#%&#” 3. top[S] top[S] + 1 Pop(S) 4. S[then top[S]] x if Stack-Empty(S) error “niedomiar” end if Pop(S) top[S] = top[S] 1. −if1Stack-Empty(S) return S[top[S] + 1] 2. then error “niedomiar” Stos – implementacja tablicowa else top S top S 4. return S top S 3. [ ] [ Bożena Woźna-Szcześniak (AJD) [ ] – 1 [ ] +1] Algorytmy i Struktury Danych. 5 2 3 Kierunek wstawiania top Stack-Empty S 1. if top S then return true 3. else return false ( ) [ ] = 0 2. 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 f i n e DLUGOSC_MAX 20 i n t co n st STOS_PELNY=3 ; i n t co n st STOS_PUSTY=2 ; i n t co n st OK = 1 ; i n t s z c z y t =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 ( v o i d ) { int 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 ) ; } return 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 [ s z c z y t ++]= 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[−− s z c z y t ] ; 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łowe, ˛ czyli poczatek ˛ kolejki. Atrybut tail[Q] wyznacza nastepn ˛ a˛ wolna˛ pozycje, ˛ na która˛ można wstawić nowy element. Elementy kolejki znjduja˛ sie˛ 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 nastepnikiem ˛ 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 usuniecia ˛ jest sygnalizowana błedem ˛ 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łedem ˛ niedomiaru. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 41 / 57 Kolejka - implementacja tablicowa 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: Dequeue(Q) if head [Q] = tail[Q] then error “Niedomiar” end if x = Q[head [Q]] if head [Q] = length[Q] then head [Q] = 1 {Założenie o cykliczności} else head [Q] = head [Q] + 1 end if return x 1 Bożena Woźna-Szcześniak (AJD) 5 ↑ tail - 2 ↑ head Algorytmy i Struktury Danych. 3 0 Wykład 4 42 / 57 Kolejka - implementacja tablicowa 1: 2: 3: 4: 5: 6: 7: 8: 9: Enqueue(Q, x) if head [Q] = (tail[Q] + 1) mod length(Q) then error “Nadmiar” end if Q[tail[Q]] = x if tail[Q] = length[Q] then tail[Q] = 1 else tail[Q] = tail[Q] + 1 end if 1 Bożena Woźna-Szcześniak (AJD) 5 ↑ tail - 2 ↑ head Algorytmy i Struktury Danych. 3 0 Wykład 4 43 / 57 Kolejka - Kolejka - implementacja tablicowa 1 2 3 Q 4 5 6 7 6 9 8 4 8 9 10 Enq(Q,17) head[Q]=4 tail[Q]=8 Enq(Q,3) Enq(Q,5) 1 2 3 Q tail[Q]=1 4 5 6 7 8 9 10 6 9 8 4 17 3 5 head[Q]=4 Deq(Q) 1 2 Q tail[Q]=1 3 4 5 6 7 8 9 10 6 9 8 4 17 3 5 head[Q]=5 Bożena Woźna-Szcześniak (AJD) 2010-02-16 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 f i n e MaxElt 20 i n t K o l e j k a [ MaxElt + 1 ] ; v o i d wstaw ( i n t x ) { K o l e j k a [ 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 o b slu z ( i n t ∗w) { i f ( head== t a i l ) r e t u r n −1; ∗w = K o l e j k a [ head + + ] ; i f ( head>MaxElt ) head =0 ; return 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 ( v o i d ) { f o r ( i n t i =0 ; i <MaxElt ; i ++) wstaw ( i ) ; int s; f o r ( i n t i =0 ; i <MaxElt ; i ++) { i n t re s = o b slu z (& s ) ; i f ( re s ==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 ( " K o l e j k a pusta ! \ n " ) ; } return 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 f i n e ITEM_H t y p e d e f s t r u c t ITEM { i n t data ; s t r u c t ITEM∗ n e xt ; } Item ; #endif 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 f i n e STACK_H # i n c l u d e < s t d b o o l . h> # include " item . h " typedef s t r u c t { Item ∗ t o p ; } Stack ; / / i n i c j a l i z u j e stos v o i d i n i t S t a c k ( Stack ∗ s ) ; / / usuwa ze s t o s u w s z y s t k i e elementy v o i d c l e a r S t a c k ( Stack ∗ s ) ; / / umieszcza element na s t o s i e v o i d push ( Stack ∗ s , i n t w ) ; / / usuwa element ze s z c z y t u s t o s u v o i d pop ( Stack ∗ s ) ; / / p o b i e r a element ze s z c z y t u s t o s u i n t t o p ( Stack c o n s t ∗ s ) ; / / zwraca t r u e , j e z e l i s t o s p u s t y b o o l stackEmpty ( Stack c o n s t ∗ s ) ; #endif 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> # in clu d e " stack . h " v o i d i n i t S t a c k ( Stack ∗ s ) { s−>to p = NULL ; } b o o l stackEmpty ( Stack co n st ∗ s ) { r e t u r n ( s−>to p == NULL ) ; } i n t to p ( Stack co n st ∗ s ) { r e t u r n s−>top −>data ; } v o i d c l e a r S t a c k ( Stack ∗ s ) { w h i l e ( ! stackEmpty ( s ) ) pop ( s ) ; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 50 / 57 Dynamiczna realizacja Stosu v o i d push ( Stack ∗ s , i n t w) { Item ∗ p = m a llo c ( s i z e o f ( Item ) ) ; p−>data = w ; p−>n e xt = NULL ; i f ( s−>to p == NULL) { s−>to p = p ; } else { p−>n e xt = s−>to p ; s−>to p = p ; } / / s t o s p u sty } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 51 / 57 Dynamiczna realizacja Stosu v o i d pop ( Stack ∗ s ) { i f ( s−>to p ! = NULL) { Item ∗ p = s−>to p ; s−>to p = p−>n e xt ; free (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 f i n e QUEUE_H # i n c l u d e < s t d b o o l . h> # i n c l u d e " ite m . h " typedef s t r u c t { Item ∗ f i r s t ; Item ∗ l a s t ; } Queue ; #endif 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 f i n e QUEUE_H / / i n i c j a l i z u j e kolejke v o i d i n i t Q u e u e ( Queue ∗ ) ; / / usuwa z k o l e j k i w s z y s t k i e elementy v o i d clearQueue ( Queue ∗ ) ; / / dodaje element do k o l e j k i v o i d i n j e c t ( Queue∗ , i n t ) ; / / p o b i e r a w a rto sc pierwszego elementu i n t f r o n t ( Queue co n st ∗ ) ; / / usuwa element z k o l e j k i v o i d e j e c t ( Queue ∗ ) ; / / zwraca t r u e , j e z e l i k o l e j k a pusta b o o l queueEmpty ( Queue q ) ; #endif 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 " v o i d i n i t Q u e u e ( Queue ∗q ) { q−> f i r s t = q−> l a s t = NULL ; } b o o l 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 co n st ∗ q ) { r e t u r n q−> f i r s t −>data ; } v o i d clearQueue ( Queue∗ q ) { w h i l e ( 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 v o i d i n j e c t ( Queue∗ q , i n t w) { Item ∗ p = m a llo c ( s i z e o f ( Item ) ) ; p−>data = w ; p−>n e xt = 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 −>n e xt = 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 v o i d e j e c t ( Queue∗ q ) { / / jeden element l u b 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−>n e xt ; free (p ) ; } } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 57 / 57