Adatszerkezetek Tömb, sor, verem Dr. Iványi Péter 1
Adat Adat minden, amit a számítógépünkben tárolunk és a külvilágból jön Az adatnak két fontos tulajdonsága van: Értéke Típusa 2
Adat típusa Az adatot kódoltan tároljuk Az adat típusa számunkra azt jelenti, hogy mi is az amit tárolunk. Ez csak nekünk bír jelentőséggel, a számítógép ezt másképp értelmezi. 3
Adat ábrázolás Ugyanakkor az adat típusa a számítógép számára is hordoz fontos információt A fordító programnak tudnia kell, hogy az adatnak mekkora helyet kell lefoglalni a memóriában és hogyan kell kódolni. Ez az adat belső ábrázolása. 4
Adat ábrázolás Az emberek számára a belső ábrázolás érthetetlen A ki-és beviteli utasítások számára más ábrázolásra van szükséges, amely az ember számára is olvasható és írható Ez az adat külső ábrázolása. 5
Adat A típus azt is meghatározza a fordító számára hogy milyen műveleteket lehet végezni az adatokon. A fordító program nem dönthet a típusról ezért a programban deklarálnunk kell az adatok típusát. 6
Adat Deklarálnunk kell a programban használt: Változók Függvények típusát A programba közvetlenül beírt adat (konstans) típusát nem kell deklarálni, mert a fordító program az adat alakjáról felismeri a típusát. 7
Változók még egyszer A változó az adat tárolására alkalmas memória hely, melynek van: Azonosítója, neve Értéke Típusa 8
Számábrázolás Egyszerű adatok 9
Mutatók A memóriában tárolt adatoknak mindig van címük. Azokat a változókat, melyek más adatok címét tartalmazzák mutatónak vagy pointer-nek nevezzük. 0 1 2 n adat1 adat2 adat3 memória címe mutató1 10
Adatszerkezetek Egyszerű adatszerkezetek összeépítésével lehet létrehozni Általában beépített adatszerkezet Tömb Halmaz Rekord Implementált adatszerkezetek Sor (FIFO) Verem Lista Fa Gráf 11
Tömb Azonos típusú adatokat tárolunk egymás után Tömböt alkotó adatok az elemek Az elemekre a tömb indexével hivatkozunk Deklaráció Tömb elemeinek típusa Tömb mérete 12
Tömb Ha a tömbnek egy indexe van, akkor egy dimenziós tömb: vektor Ha a tömbnek két indexe van, akkor két dimenziós tömb: mátrix Index egész számok sorozata nullától vagy egytől Tárolás sorfolytonosan, elemeket egymás után Több dimenziós tömböket leképezzük egy dimenziós tömbre 13
Tömb tárolás a b c A(1,1) A(2,1) A(3,1) A(1,2) A(2,2) A(3,2) A(1,3) A(2,3) A(3,3) a b c 14
Tömbök feldolgozása A tömbök feldolgozása szorosan összefügg a ciklusokkal Tömb minden egyes elemét feldogozzuk Számláló ciklus Tömb elemein valamilyen tulajdonság meglétét vizsgáljuk Elől-vagy hátultesztelő ciklus 15
Halmaz Halmaz elemei ugyanolyan típusúak Egy elem csak egyszer fordulhat elő Nem minden programozási nyelvben van ilyen típus 16
Rekord Elemei különböző típusúak Egy rekord komponenseit mezőnek nevezzük Lehet fix és változó méretű Változó méret esetén Egy mező értékétől függően a többi mező típusa vagy mérete is változhat Rekordokból is lehet tömböket definiálni 17
Jellemzők Az eddigi adatszerkezetek a programozási nyelvekben általában megtalálhatók. A további adatszerkezeteket a programozónak kell létrehoznia. További adatszerkezetek alapja az egy-dimenziós tömb. 18
Sor Az egymás után beírt adatokat a beírás sorrendjében vehetjük ki. FIFO First In First Out Például: Két nem egyforma sebességgel működő rendszer közötti adatátvitelt akarunk biztosítani, vagy Adatok átadása nem folyamatos, pl. lökésszerű 19
Két alap utasítás van: Sor IN: egy elemet betesz a sorba Ha megtelt a sor hibaüzenetet kell adni OUT: kiveszi a sor következő elemét Ha a sor üres akkor is hibaüzenet, vagy Olyan adatot adunk vissza ami nem fordulhat elő egyébként 20
Megvalósítás 1. Egy dimenziós tömb: tomb Egy mutató, mely megmutatja, hogy hol van a következő üres elem a tömbben: mutato A mutató 0-től indul n-1 ig (mint a C nyelvben) 21
Megvalósítás, IN függvény in be: adat ha mutato = n akkor ki: sor megtelt különben tomb[mutato] = adat mutato = mutato + 1 ki: érvényes elágazás vége függvény vége O(1) 22
Megvalósítás, OUT függvény out O(n) ha mutató = 0 akkor ki: üres sor különben ki: tomb[0] /* első elem kivétele */ ciklus i = 2 mutato tomb[i-1] = tomb[i] ciklus vége mutato = mutato - 1 elágazás vége függvény vége A ciklus lassítja a kivételt, a megvalósítás hátránya!!! 23
Működési példa 1. mutato 0 1 2 Inicializálás mutato 0 1 2 5 IN(5) 24
Működési példa 2. mutato 0 1 2 56 IN(6) mutato 0 1 2 6 OUT 5 25
Megvalósítás 2. Egy dimenziós tömb: tomb Két mutató A mutató 0-tól indul n-1 ig (mint a C nyelvben) psorba: ahova a következő elemet be kell tenni psorbol: ahonnan a következő elemet ki kell venni Ha bármelyik mutató túlmutat a tömb utolsó elemén akkor a mutatót a tömb első elemére irányítjuk. 26
Megvalósítás 2. Normális esetben a két mutató nem mutathat ugyanoda Mikor üres a sor? Ha a psorba egyenlő a psorbol mutatóval. Mikor van tele egy sor? Ha a a psorba utoléri a psorbol mutatót. Ugyanaz nem jelentheti mindkét eseményt!!! 27
Megvalósítás 2. Tele sor jele ha: psorbol = psorba+1 Beírás utoléri a kivételt psorba... Üres sor jele ha: psorba = psorbol+1 Kivétel utoléri a beírást psorbol psorbol... psorba 28
Megvalósítás, IN psorba = 1 psorbol = 0 O(1) függvény in be: adat ha (psorba+1) = psorbol akkor ki: tele van a sor, érvénytelen különben tomb[psorba] = adat psorba = psorba + 1 psorba ki: érvényes elágazás vége függvény vége psorbol... 29
Megvalósítás, OUT függvény out ha (psorbol+1) = psorba akkor ki: üres sor különben psorbol = psorbol + 1 ki: tomb[psorbol] elágazás vége függvény vége O(1) psorba 1 psorbol... 30
Végtelenítjük a sort Megvalósítás 2. Ha bármelyik mutató túlmutat a tömb utolsó elemén akkor a mutatót a tömb első elemére irányítjuk. Maradék osztást használunk index 0 1 2 3 4 5 index mod 4 0 1 2 3 0 1 31
Megvalósítás, IN psorba = 1 psorbol = 0 függvény in be: adat ha ((psorba+1) mod n) = psorbol akkor ki: tele van a sor, érvénytelen különben tomb[psorba] = adat psorba = (psorba + 1) mod n ki: érvényes elágazás vége függvény vége 32
Megvalósítás, OUT függvény out ha ((psorbol+1) mod n) = psorba akkor ki: üres sor különben psorbol = (psorbol + 1) mod n ki: tomb[psorbol] elágazás vége függvény vége 33
Működési példa 1. psorba Inicializálás psorbol psorbol psorba 1 IN(1) 34
Működési példa 2. psorba 1 OUT 1 psorbol psorba 1 OUT üres sor psorbol 35
Működési példa 3. 0 1 2 3 psorba 1 4 IN(4) psorbol psorba 0 1 2 3 1 4 OUT 4 psorbol 36
Működési példa 4. psorba 0 1 2 3 1 4 3 IN(3) psorba= 3 + 1 mod 4 = 4 mod 4 = 0 psorbol psorba 0 1 2 3 5 1 4 3 IN(5) psorbol 37
Működési példa 5. psorba 0 1 2 3 5 1 4 3 IN(6) a sor tele psorbol 38
Verem Az utoljára bevitt adatot lehet először kivenni LIFO Last In First Out Stack nek is szokták nevezni Sok helyen használják Operációs rendszerek Függvények hívása Verem (véges) és verem mutató (stack pointer) 39
PUSH Elem betétele Ha tele a verem, hiba POP Elem kivétele Ha üres a verem, hiba Verem műveletek 40
Megvalósítás, PUSH függvény PUSH be:adat ha verem_mutato = n akkor ki: tele van a verem különben verem[verem_mutato] = adat verem_mutato = verem_mutato + 1 elágazás vége függvény vége 41
Megvalósítás, POP függvény POP ha verem_mutato = 0 akkor ki: üres a verem különben verem_mutato = verem_mutato - 1 ki: verem[verem_mutato] elágazás vége függvény vége 42
Működési példa 1. 3 2 1 0 n = 4 verem_mutato = 0 Inicializálás 3 PUSH(112) 2 1 0 112 verem_mutato = 1 43
Működési példa 2. 3 PUSH(33) 2 1 0 33 112 verem_mutato = 2 3 POP 2 1 0 33 112 verem_mutato = 1 33 44
Működési példa 3. 3 POP 2 1 0 33 112 verem_mutato = 0 112 3 POP 2 1 0 33 112 verem_mutato = 0 hiba 45
Postscript Programozási nyelv, Adobe Systems Inc. PDF elődje Stack alapú Szótárakat (dictionary) használ Interpreter alapú Postscript interpreter értelmezi a programot 46
Post-fix jelölés Postscript műveletek Matematikai jelöles 6 33 add 6+33 Az operandus PUSH-t jelent A művelet kiveszi a stack-ből az értékeket, majd az eredményt visszateszi a stack-re 6 33 add 6 33 6 39 47
6+ 3 / 8 Post-fix jelöléssel: 3 8 div 6 add 3 8 div 6 add 3 8 3 0.375 6 0.375 6.375 48
6+ 3 / 8 Post-fix jelöléssel: 6 3 8 div add 6 3 8 div add 6 3 6 8 3 6 0.375 6 6.375 49
8 7 * 3 Két módszerrel: 8 7 3 mul sub 7 3 mul 8 exch sub 7 3 mul 8 exch sub 21 8 21 21 8-13 50
Példa program %!PS-Adobe-2.0 /inch {72 mul} def /wedge { newpath 0 0 moveto 1 0 translate 15 rotate 0 15 sin translate 0 0 15 sin -90 90 arc closepath } def gsave 4.25 inch 4.25 inch translate 1.75 inch 1.75 inch scale 0.02 setlinewidth 1 1 12 { 12 div setgray gsave wedge gsave fill grestore 0 setgray stroke grestore 30 rotate } for grestore showpage 51
Példa program eredménye 52