ADATSZERKEZETEK (VEREM, SOR)



Hasonló dokumentumok
Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Verem Verem mutató 01

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Adatszerkezetek 1. Dr. Iványi Péter

Algoritmusok és adatszerkezetek I. 2. előadás

Algoritmusok és adatszerkezetek I. 2. előadás

Egyirányban láncolt lista

5. SOR. Üres: S Sorba: S E S Sorból: S S E Első: S E

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Programozás alapjai II. (7. ea) C++

Rekurzió. Dr. Iványi Péter

Adatszerkezetek 1. előadás

A programozás alapjai előadás. [<struktúra változó azonosítók>] ; Dinamikus adatszerkezetek:

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Algoritmusok és adatszerkezetek I. 1. előadás

Adatszerkezetek és algoritmusok

Kupac adatszerkezet. A[i] bal fia A[2i] A[i] jobb fia A[2i + 1]

Információs Technológia

4. VEREM. Üres: V Verembe: V E V Veremből: V V E Felső: V E

Adatszerkezetek 7a. Dr. IványiPéter

Programozás alapjai. 10. előadás

Adatszerkezetek I. 7. előadás. (Horváth Gyula anyagai felhasználásával)

Amortizációs költségelemzés

Elemi adatszerkezetek

Adatszerkezetek I. 1. előadás

Rekurzió. Működése, programtranszformációk. Programozás II. előadás. Szénási Sándor.

Programozási nyelvek Java

.Net adatstruktúrák. Készítette: Major Péter

Láncolt listák. Egyszerű, rendezett és speciális láncolt listák. Programozás II. előadás. Szénási Sándor

Java programozási nyelv

Bevezetés a Programozásba II 12. előadás. Adatszerkezetek alkalmazása (Standard Template Library)

Algoritmusok és adatszerkezetek I. 3. előadás

Láncolt Listák. Adat1 Adat2 Adat3 ø. Adat1 Adat2 ø Adat3

Algoritmizálás és adatmodellezés tanítása 6. előadás

3/1. tétel: Linearis adatszerkezetek és műveleteik

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Aritmetikai kifejezések lengyelformára hozása

A 2008/2009 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

Web-programozó Web-programozó

Egyszerű programozási tételek

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

A programozás alapjai előadás. Amiről szólesz: A tárgy címe: A programozás alapjai

10. előadás Speciális többágú fák

Adatszerkezetek I. 8. előadás. (Horváth Gyula anyagai felhasználásával)

Adatszerkezetek I. 4. előadás

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

BASH script programozás II. Vezérlési szerkezetek

Programozási segédlet

21. Adatszerkezetek Az adattípus absztrakciós szintjei Absztrakt adattípus (ADT) Absztrakt adatszerkezet (ADS) Egyszerű adattípusok Tömbök

Mutatók és mutató-aritmetika C-ben március 19.

Buborékrendezés: Hanoi Tornyai: Asszimptótikus fv.ek: Láncolt ábrázolás: For ciklussal:

1. ábra. Egy rekurzív preorder bejárás. Egy másik rekurzív preorder bejárás

A lista adatszerkezet A lista elemek egymásutániságát jelenti. Fajtái: statikus, dinamikus lista.

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus adatszerkezetek. Dinamikus adatszerkezetek. Önhivatkozó struktúrák. Önhivatkozó struktúrák

Struktúra nélküli adatszerkezetek

8. gyakorlat Pointerek, dinamikus memóriakezelés

Algoritmusok és adatszerkezetek I. 4. előadás

félstatikus adatszerkezetek: verem, várakozási sor, hasítótábla dinamikus adatszerkezetek: lineáris lista, fa, hálózat

Láncolt listák. PPT 2007/2008 tavasz.

Algoritmusok és adatszerkezetek gyakorlat 07

Programozási nyelvek Java

2. AZ ADATTÍPUS ABSZTRAKCIÓS SZINTJEI

OOP #1 (Bevezetés) v :39:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Pásztor Attila. Algoritmizálás és programozás tankönyv az emeltszintű érettségihez

Algoritmizálás, adatmodellezés 1. előadás

Szkriptnyelvek. 1. UNIX shell

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Adatszerkezetek II. 2. előadás

8. előadás Dinamikus memóriakezelés. Mutatók. Láncolt adatszerkezetek.

Mindenki abból a három tantárgyból tesz szigorlatot, amelyet hallgatott.

Generikus osztályok, gyűjtemények és algoritmusok

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

Programozási technológia

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Adatszerkezetek és algoritmusok

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Paraméter átadás regisztereken keresztül

Más szavakkal formálisan:, ahol olyan egész szám, hogy. Más szavakkal formálisan:, ahol olyan egész szám, hogy.

Adatszerkezetek és algoritmusok

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

Absztrakt adatstruktúrák A bináris fák

Kulcs transzformációs táblázat

Adatszerkezetek Bevezetés Adatszerkezet Adatszerkezet típusok Műveletek Bonyolultság

Irányítástechnika Elıadás. PLC-k programozása

1.előadás Tornai Kálmán

BABEŞ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR BBTE Matek-Infó verseny 1. tételsor INFORMATIKA írásbeli. A versenyzők figyelmébe:

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

A rész (30 pont) A.1. Vajon mit csinál? (5 pont) A generál(n) algoritmus egy n természetes számot dolgoz fel (0 < n < 100).

Máté: Számítógép architektúrák

van neve lehetnek bemeneti paraméterei (argumentumai) lehet visszatérési értéke a függvényt úgy használjuk, hogy meghívjuk

C++ programozási nyelv

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs

Adatszerkezetek II. 1. előadás

Ugrólisták. RSL Insert Example. insert(22) with 3 flips. Runtime?

Átírás:

ADATSZERKEZETEK (VEREM, SOR) 1. ADATSZERKEZET FOGALMA Az adatszerkezet egymással kapcsolatban álló adatok összessége, amelyen meghatározott, az adatszerkezetre jellemző műveletek végezhetők el. Az adatok közötti kapcsolatok alapján megkülönböztethetünk: - szekvenciális szerkezeteket, sorozatokat (pl. szekvenciális fájl, verem, sor, lista): azonos típusú elemeket tartalmaznak, minden elemnek (az utolsót kivéve) pontosan egy rákövetkező eleme van, ez meghatározza a feldolgozás sorrendjét. - hierarchikus szerkezeteket: egy elemek hierarchikusan egymás alá vannak rendelve. (pl. bináris fa, általános fa) - hálós szerkezeteket: bármely elem bármely másikkal kapcsolatban állhat (gráf) Az adatszerkezetek nagyobb része a programozási nyelvekben nem definiált, azt a programozó hozza létre problémák megoldásához. 2. VEREM (STACK) 2.1 A verem fogalma A verem adatszerkezet egy speciális szekvenciális tároló, amelyből mindig a legutolára betett elemet vehetjük ki legelőször. Emiatt szokás a vermet LIFO (Last In First Out) szerkezetnek nevezni. 2.2 A verem megengedett műveletei - Verembe (push): egy elem betétele a verembe (a verem tetejére ). Csak lehetséges, ha a verem még nem telt meg. - Veremből (pop): a verem tetején található elem kivétele a veremből. Csak tudunk elemet kivenni, ha a verem nem üres. - Inicializálás:(init): alapállapotba helyezés, űrítés. (Dinamikus megvalósítása esetén ez két különböző eljárás.) - Üres?: igaz, ha a veremben egyetlen elemet sem tárolunk. - Teli?: igaz, ha a verembe már nem tehetünk újabb elemet, mert megtelt. (Dinamikus megvalósítás esetén csak van tele a verem, ha a rendelkezésünkre álló memória elfogyott) 2.3 A verem statikus megvalósítása Statikus megvalósítás esetén a verembe tett elemeket egy vektorban tároljuk, a veremben lévő elemek számát, más szóval az utoljára betett elem sorszámát egy ún. veremmutató tartalmazza. Ha új elemet teszünk a verembe, a veremmutató értéke eggyel nő, ha kiveszünk, eggyel csökken. Üres verem esetén értéke 0, teli verem esetén pedig egyenlő a vektor maximális indexével. 1

Konstans Max=... Típus ElemTipus=... TVerem=Rekord Mut:Egész Elemek:Tömb[1..Max]:ElemTipus Eljárás Init(Változó V:TVerem) V.Mut:=0 Függvény Ures(V:TVerem):Logikai Ures:= (V.Mut=0) Függvény Teli(V:TVerem):Logikai Teli= (V.Mut=Max) Függvény Verembe(Változó V:TVerem;E:ElemTipus):Logikai Ha nem(teli(v)) V.Mut:=V.Mut+1 V.Elemek[V.Mut]:=E Verembe:= Igaz Verembe:= Hamis Függvény Verembol(Változó V:TVerem;Változó E:ElemTipus):Logikai Ha nem(ures(v)) E:=V.Elemek[V.Mut] V.Mut:=V.Mut-1 Verembol:= Igaz Verembe:=Hamis Megjegyzések: - Ebben a megvalósításban a Veremből, Verembe műveletek végrehajtásának sikerét egy logikai értékkel adjuk vissza, a műveleteket ezért függvényszerűen írtuk meg. Hívásuk pl.: Ha Nem(Verembe(V,E)) Akkor Uzenet( Tele a verem! ) - Kicsit hatékonyabb, ha a Verembe függvényben a Ha nem(teli(v)) feltétel helyett Ha Teli(V)-t írunk, és a két ágat felcseréljük. (Csak nem olyan szép.) - A statikus megvalósítás hátránya, hogy is lefoglaljuk a maximális veremterületet, ha a veremben kevés elem van. 2

2.4 A verem dinamikus megvalósítása Dinamikus megvalósítás esetén a verem elemeit láncoltan ábrázoljuk, minden elemhez tartozik egy mutató, amely a következő elemre mutat. A legutolsó elemhez tartozó mutató NIL. A TVerem típust egy mutatóként definiáljuk, amely a verem tetején lévő elemre mutat. Verembe tételkor egy rekordnyi (TVeremRekord) helyet lefoglalunk a heap-ben, az adatrészbe beírjuk az új elemet, és a rekordot a verem elé láncoljuk. Kivételkor a verem tetején található rekord adatrészét kiolvassuk, majd a rekordot kiláncoljuk a veremből, helyét felszabadítjuk. Type ElemTipus=... Mutato=^TVeremRekord TVeremRekord=Rekord Adat:Elemtipus Mut:Mutato TVerem=Mutato Eljárás Init(Változó V:TVerem) V:=Nil Függvény Ures(V:TVerem):Logikai Ures:= (V=Nil) Függvény Teli(V:TVerem):Logikai Teli:= KevesAHeapEgyElemhez // Pascalban: MaxAvail<SizeOf(TVeremRekord) Függvény Verembe(Változó V:TVerem;E:ElemTipus):Logikai Változó Uj:Mutato Ha nem(teli(v)) Lefoglal(Uj) // Pascal: New(Uj) Uj^.Adat:=E Uj^.Mut:=V V:=Uj Verembe:=Igaz Verembe:= Hamis Függvény Verembol(Változó V:TVerem;Változó E:ElemTipus):Logikai Változó Regi:Mutato Ha nem(ures(v)) E:=V^.Adat Regi:=V V:=V^.Mut Felszabadit(Regi) // Pascal: Dispose(Regi) Verembol:=Igaz Verembe:=Hamis 3

Eljárás Urit(Változó V:TVerem) Változó E:ElemTipus Ciklus amíg nem(ures(v)) Verembol(V,E) Ciklus vége Megjegyzés: - Az Urit eljárás nem helyettesíthető az Init-tel, mivel az utóbbi nem szabadítja fel a verem elemei által lefoglalt heap területet. Az Urit eljárást viszont használhatjuk az Init helyett. 2.5 A verem alkalmazása Néhány példa a verem adatszerkezet alkalmazására: - Programozási nyelvekben az egymásba ágyazott eljárások, illetve függvények, valamint a rekurzió megvalósítása. Az eljárások, függvények lokális változói, érték szerint átvett paraméterei a rendszer veremben kerülnek létrehozásra. Az eljárás végrehajtása után kikerülnek a veremből, azaz megszűnnek. Beágyazott eljárás, függvény hívásakor a veremre kerül a visszatérési cím is, vagyis az, hogy melyik sornál kell majd folytatni a programot, ha a beágyazott eljárás végrehajtásra került. - Zárójelezett kifejezés / (), [], {} / helyességének az ellenőrzése. Bal zárójel a verembe kerül, jobb zárójel esetén kivesszük a verem tetején lévő bal zárójelet, és összehasonlítjuk az aktuális jobb zárójellel. Ha párt alkotnak, nem romlott el a zárójelezés, tovább vizsgáljuk. Zárójelezési hibák: nem megfelelő pár; túl sok bal zárójel (a vizsgálat végén marad elem a veremben); túl sok jobb zárójel (üres veremből akarunk kivenni). Hasonlóan ellenőrizhető Pascal programban a begin/end; repeat/until; case/end párok helyessége. - Undo (mégsem) funkció megvalósítása az alkalmazói programokban. Kissé módosított verem, ugyanis a túlságosan régen végrehajtott műveleteket nem tároljuk. A végrehajtott műveletek kódja (esetleg néhány jellemzője) a verembe kerül, a mégsem végrehajtásakor a legutolsó művelet kódját kivesszük, és visszavonjuk a műveletet. 3. SOR (QUEUE) 3.1 A sor fogalma A sor adatszerkezet egy speciális szekvenciális tároló, amelyből mindig a legelsőként betett elemet vehetjük ki legelőször. Emiatt szokás a sort FIFO (First In First Out) szerkezetnek nevezni. 3.2 A sor megengedett műveletei - Sorba (put): egy elem betétele a sorba (a sor végére ). Csak lehetséges, ha a sor még nem telt meg. - Sorból (get): a sor elején található elem kivétele. Csak tudunk elemet kivenni, ha a sor nem üres. - Inicializálás:(init): alapállapotba helyezés, űrítés. - Üres?: igaz, ha a sorban egyetlen elemet sem tárolunk. 4

- Teli?: igaz, ha a sorba már nem tehetünk újabb elemet, megtelt. (Dinamikus megvalósítás esetén csak van tele a sor, ha a rendelkezésünkre álló memória elfogyott) 3.3 A sor statikus megvalósítása Statikus megvalósítás esetén a sorba tett elemeket egy vektorban tároljuk, az első, ill. az utolsó elem sorszámát (mutatóját), valamint a sorban lévő elemek darabszámát egy-egy egész értékben tároljuk. Ha új elemet teszünk a sorba, a vége mutató, ha kiveszünk egy elemet, pedig az eleje mutató értéke nő (ciklikusan) eggyel. A ciklikus növelés azt jelenti, hogy a maximális érték elérése után a következő lépésben 1 lesz az értéke. Ez a megoldás lehetővé teszi a vektor teljes kihasználását. (Ha a sorba helyezett elemekkel elértük a vektor végét, és közben vettünk ki az elejéről, a sorba tett újabb elemek fizikailag - a vektor elejére kerülnek) A darabszám tárolása egyszerűsíti a megvalósítást. Konstans Max=... Típus ElemTipus=... TSor=Rekord Eleje,Vege,Db:Egész Elemek:Tömb[1..Max]:ElemTipus Eljárás Init(Változó S:TSor) S.Db:=0 S.Eleje:=1 //Ha egy elemet beteszünk, az S.Eleje és az S.Vege is 1 lesz! S.Vege:=0 Függvény Ures(S:TSor):Logikai Ures:=(S.Db=0) Függvény Teli(S:TSor):Logikai Teli:=(S.Db=Max) Függvény Sorba(Változó S:TSor;E:ElemTipus):Logikai Ha Nem(Teli(S)) S.Db:=S.Db+1 Ha S.Vege<Max S.Vege:=S.Vege+1 S.Vege:=1 S.Elemek[S.Vege]:=E Sorba:=Igaz Sorba:=Hamis 5

Függvény Sorbol(Változó S:TSor; Változó E:ElemTipus):Logikai Ha Nem(Ures(S)) S.Db:=S.Db-1 E:=S.Elemek[S.Eleje] Ha S.Eleje<Max S.Eleje:=S.Eleje+1 S.Eleje:=1 Sorbol:=Igaz Sorbol:=Hamis 3.4 A sor dinamikus megvalósítása Dinamikus sor esetén az elemeket (a dinamikus veremhez hasonló módon) láncoltan ábrázoljuk, minden elemhez tartozik egy mutató, amely a következő elemre mutat. A legutolsó elemhez tartozó mutató NIL. A TSor típust egy két mutatót (Eleje, Vége) tartalmazó rekordként definiáljuk. Sorba tételkor egy rekordnyi (TSorRekord) helyet lefoglalunk a heap-ben, az adatrészbe beírjuk az új elemet, és a rekordot a sor végére láncoljuk. Kivételkor a sor elején található rekord adatrészét kiolvassuk, majd a rekordot kiláncoljuk a sorból, helyét felszabadítjuk. Type ElemTipus=... Mutato=^TSorRekord TSorRekord=Rekord Adat:Elemtipus Mut:Mutato TSor=Rekord Eleje,Vege:Mutato Eljárás Init(Változó S:TSor) S.Eleje:=Nil S.Vege :=Nil Függvény Ures(S:TSor):Logikai Ures:= (S.Eleje=Nil) Függvény Teli(S:TSor):Logikai Teli:= KevesAHeapEgyElemhez // Pascalban: MaxAvail<SizeOf(TSorRekord) 6

Függvény Sorba(Változó S:TSor;E:ElemTipus):Logikai Változó Uj:Mutato Ha nem(teli(s)) Lefoglal(Uj) Uj^.Mut:=Nil Uj^.Adat:=E Ha Ures(S) S.Eleje:=Uj S.Vege^.Mut:=Uj S.Vege:=Uj; Sorba:=Igaz Sorba:=Hamis Függvény Sorbol(Változó S:TSor;Változó E:ElemTipus):Logikai Változó Regi:Mutato Ha nem(ures(s)) E:=S.Eleje^.Adat Regi:=S.Eleje S.Eleje:=S.Eleje^.Mut Felszabadit(Regi) Sorbol:=Igaz Sorbol:=Hamis Eljárás SorUrit(Változó S:TSor) Változó E:ElemTipus Ciklus amíg nem(ures(s)) Sorbol(S,E) Ciklus vége // Pascal: Dispose(Regi) 3.5 A sor alkalmazása Néhány példa a sor adatszerkezet alkalmazására: - Billentyűzet puffer, nyomtatási sor - Gráf szélességi bejárásakor az algoritmus egy sorban tárolja a még nem bejárt, de már kiterjeszett (piros) csúcspontokat. - Szimulációk: közlekedés, várakozás szimulálása - MI: emlékezet szimulálása: a megismert információk (pl. Memory játékban a felütött lapok) egy sorba kerülnek. Minél jobb a gépi játékos, annál nagyobb a sor kapacitása. Ha a sor megtelik, az elejéről kikerülnek az információk (felejtés) 7