Algorytmy i Struktury Danych.

advertisement
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
Download