Algorytmy i Struktury Danych.

Podobne dokumenty
Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych.

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

Struktury danych: stos, kolejka, lista, drzewo

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

Algorytmy i Struktury Danych.

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Wykład 3. Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy

Algorytmy i. Wykład 3: Stosy, kolejki i listy. Dr inż. Paweł Kasprowski. FIFO First In First Out (kolejka) LIFO Last In First Out (stos)

Algorytmy i Struktury Danych.

Dynamiczne struktury danych

Algorytmy i Struktury Danych

E S - uniwersum struktury stosu

Programowanie i struktury danych 1 / 44

Odwrotna Notacja Polska

Podstawy informatyki 2

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Podstawy informatyki 2. Podstawy informatyki 2. Wykład nr 2 ( ) Plan wykładu nr 2. Politechnika Białostocka. - Wydział Elektryczny

Wykład 6_1 Abstrakcyjne typy danych stos Realizacja tablicowa i za pomocą rekurencyjnych typów danych

Wykład 6. Dynamiczne struktury danych

Temat: Liniowe uporzdkowane struktury danych: stos, kolejka. Specyfikacja, przykładowe implementacje i zastosowania. Struktura słownika.

TRANSLACJA I TRANSLATORY

Programowanie obiektowe

Marcin Matusiak i Łukasz Stasiak

Abstrakcyjne struktury danych w praktyce

Programowanie Proceduralne

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

Stos LIFO Last In First Out

Struktury danych (I): kolejka, stos itp.

Algorytmy i Struktury Danych.

Notacja RPN. 28 kwietnia wyliczanie i transformacja wyrażeń. Opis został przygotowany przez: Bogdana Kreczmera.


KOLEJKA (QUEUE) (lista fifo first in, first out)

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Wstęp do programowania

Algorytmy i Struktury Danych

Algorytmy i Struktury Danych. Co dziś? Drzewo decyzyjne. Wykład IV Sortowania cd. Elementarne struktury danych

Wstęp do programowania

Listy, kolejki, stosy

ZASADY PROGRAMOWANIA KOMPUTERÓW

Dynamiczne struktury danych

Podstawowe struktury danych

Podstawy programowania skrót z wykładów:

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Dynamiczny przydział pamięci (język C) Dynamiczne struktury danych. Sortowanie. Klasyfikacja algorytmów sortowania. Algorytmy sortowania

Algorytmy i Struktury Danych.

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Struktury danych. przez użytkownika, jak to ma miejsce w przypadku zwykłych zmiennych statycznych.

INFORMATYKA DANE.

Struktury Danych i Złożoność Obliczeniowa

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Wstęp do Programowania 2

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych

Wstęp do programowania

Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska

STL: Lekcja 1&2. Filozofia STL

Programowanie Procedurale

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Wstęp do Informatyki

tablica: dane_liczbowe

Lista, Stos, Kolejka, Tablica Asocjacyjna

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Kurs programowania. Wykład 9. Wojciech Macyna

Wstęp do programowania. Wykład 1

Algorytmy i Struktury Danych.

Kurs II, zajęcia 1. Tomasz Kulczyński, Błażej Osiński, Wojciech Śmietanka. Stos, kolejka i lista. Stos. Kolejka. Lista dwukierunkowa

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Programowanie i struktury danych

Wykład 4. Klasa List Kolejki Stosy Słowniki

DYNAMICZNE PRZYDZIELANIE PAMIECI

INFORMATYKA. Podstawy programowania w języku C. (Wykład) Copyright (C) 2005 by Sergiusz Sienkowski IME Zielona Góra

Część 4 życie programu

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Struktury. Przykład W8_1

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Wykłady opracowane zostały w oparciu o materiały prof. dr hab. Jerzego Weresa. Poznań 2009/2010 Algorytmy i struktury danych Krzysztof Nowakowski 2

dr inż. Paweł Myszkowski Wykład nr 11 ( )

Algorytmy i Struktury Danych.

Rekurencja. Przygotowała: Agnieszka Reiter

Podstawy Programowania

Informatyka 2. Wykład nr 5 ( ) Plan wykładu nr 5. Politechnika Białostocka. - Wydział Elektryczny. Odwrotna notacja polska.

Informatyka 2. Wykład nr 5 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Programowanie i struktury danych

Projektowanie klas c.d. Projektowanie klas przykład

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Kiedy potrzebne. Struktura (rekord) Struktura w języku C# Tablice struktur. struktura, kolekcja

Algorytmy. Paweł Dudzik, Adrian Guzik. Kraków, 6 lipca AGH Kraków. Paweł Dudzik, Adrian Guzik (AGH Kraków) Algorytmy Kraków, 6 lipca / 37

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

12. Rekurencja. UWAGA Trzeba bardzo dokładnie ustalić <warunek>, żeby mieć pewność, że ciąg wywołań się zakończy.

Wstęp do programowania. Stosy i kolejki. Piotr Chrząstowski-Wachtel

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

Abstrakcyjne struktury danych - stos, lista, drzewo

Algorytmy i struktury danych. wykład 5

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Przykładowe B+ drzewo

Przekazywanie argumentów wskaźniki

Transkrypt:

Algorytmy i Struktury Danych. Podstawowe struktury danych dr hab. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 6 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 1 / 33

Plan Motywacja Abstarkcyjne struktury danych Liniowe struktury danych Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 2 / 33

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 6 2 / 33

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, czyli jest to statyczna struktura danych. Statyczność 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 6 3 / 33

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, czyli jest to statyczna struktura danych. Statyczność 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. Dlatego też potrzebujemy struktury, która pozwala na przechowywanie elementów w fizycznie różnym porzadku. 2 5 4 0 3 1 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 3 / 33

Struktury danych Struktury danych, sa zaawansowanymi pojemnikami na dane, które gromadza je i układaja w odpowiedni sposób. Różnorodność struktury danych jest ogromna, a dla każdej znaleziono wiele zastosowań oraz interesujacych algorytmów. Struktury danych stosuje się 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 6 4 / 33

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). Źródło:https: //pl.wikipedia.org/wiki/ Niklaus_Wirth Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 5 / 33

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 6 6 / 33

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 6 6 / 33

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 6 7 / 33

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 6 8 / 33

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 i Push d 1 Szczyt stosu d 2 d 3 d 4 d 5 NULL Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 9 / 33

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 6 10 / 33

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 6 11 / 33

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 6 12 / 33

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 6 13 / 33

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 6 14 / 33

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 6 15 / 33

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 6 16 / 33

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 6 17 / 33

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 6 18 / 33

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 Poczatek kolejki d 1 d 2 d 3 d 4 d 5 Koniec kolejki Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 19 / 33

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 6 20 / 33

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 6 21 / 33

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 Kierunek top wstawiania Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 22 / 33

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 Kierunek top wstawiania Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 23 / 33

Stos - implementacja tablicowa # include <iostream > using namespace std ; i n t const 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 6 24 / 33

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 6 25 / 33

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 6 26 / 33

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 6 27 / 33

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 6 28 / 33

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 6 29 / 33

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 6 30 / 33

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 6 31 / 33

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 6 32 / 33