U K. Paneme sinna U (push(u)) K Võtame K välja (pop()) Pinu on tühi.

Similar documents
Maitsjast maitseni Santa Maria moodi. Rainer Tammet 29. aprill 2015

Infootsing ravijuhendite koostamiseks. Ravijuhendid. Pärnu Otsime: ravijuhendeid. süstemaatilisi ülevaateid

Data Mining Research Project Report Generating Texts in Estonian Language. Author: Robert Roosalu Supervisor: Tambet Matiisen

OMA HALDJARIIKI KAITSTES

(Kasutatud on Penker'i UML Toolkit-i, Fowler'i UML Destilled ja Larman'i Applying UML and Patterns)

Humanistlikud pedagoogilised süsteemid II. Ene-Silvia Sarv Kursus: kasvatusteadus ja kasvatusfilosoofia Kasvatusteaduste Instituut 2009

Kasutatava tarkvara võrdlus andmeohje aspektist

TARTU ÜLIKOOL Matemaatika-informaatikateaduskond Arvutiteaduse instituut. Referaat. XP vs. RUP. Autor: Martin Mäe. Juhendaja: Erik Jõgi

From the brain to intelligent systems: The attenuation of sensation of self-generated movement

Graafikud ja animatsioonid

NÜÜDISKULTUURI HÄÄLEKANDJA KUUEKÜMNE NELJAS NUMBER : MAI 2017 HIND 2 #64 : RÄNNUD

Meeskonnatöö mängude kogumik

ÜLDISTATUD TEISENDUSKAUGUSE RAKENDAMINE SÕNEDE SARNASUSE HINDAMISEKS

Lev Võgotski teooria täna

Isikuandmete kaitse delikaatsetes registrites

NÜÜDISKULTUURI HÄÄLEKANDJA KOLMEKÜMNE VIIES number : JUUNI/JUULI 2014 HIND 2 / VABALEVIS TASUTA #35

Praktilised meetodid programmeeritava loogikakontrolleri tarkvara testimiseks

Kognitiivse pöörde puhul ei saa vist väita, et pööre puudutas ainult

KÄSIRAAMAT. Organisatsiooni ARENDAMINE. KIRJUTAS Kristina Mänd

TAJU STRUKTUUR ARISTOTELESE FILOSOOFIAS

Kultuur ja isiksus. Jüri Allik, Anu Realo. Teaduse sõjad

MS Excel 2007 jätkukursus

TALLINNA TEHNIKAÜLIKOOL INTELLIGENTSED SÜSTEEMID*

TALLINNA ÜLIKOOL Informaatika Instituut. Sirle Budris MULTIMEEDIUMIPÕHISTE ÕPIOBJEKTIDE KOOSTAMINE. Magistritöö

NÜÜDISKULTUURI HÄÄLEKANDJA NELJAKÜMNE KOLMAS number : APRILL 2015 HIND 2 #43

Bo Hejlskov Elvén ja Tina Wiman PAHURAD LAPSED. Miks lapsed tujutsevad ja kuidas sellega toime tulla?

HeaKodanik nr. Kuidas levivad. teadmised, huvi ja oskused? november EMSLi ajakiri kodanikuühiskonnast

Köögikubu juhtimine mikrokontrolleri baasil

LASTE ÕIGUSTE TAGAMINE

EESTI STANDARD EVS-ISO 7305:2003. JAHVATATUD TERAVILJASAADUSED Rasva happesuse määramine. Milled cereal products Determination of fat acidity

Kataloog - failide haldamise viis. Kataloog on loogiline struktuur, mis hõlmab mingite

TARTU ÜLIKOOL. Profileerimise tajumisest internetis gümnaasiumiõpilaste seas. Sotsiaalteaduste valdkond. Ühiskonnateaduste instituut

KUIDAS MUUTA MEIE IDEID SELGEKS *

BRÄNDIMISE TÄHENDUS EESTI ERAETTEVÕTETES

MITMIKE PEREDE RAHULOLU JA TOIMETULEK IGAPÄEVAELUGA

ONLINE KASSASÜSTEEMIDE KASUTAMISE VÕIMALUSED EESTI TOITLUSTUSETTEVÕTETES

TARTU ÜLIKOOLI NARVA KOLLEDŽ EESTI KEELE JA KIRJANDUSE LEKTORAAT

Subjekti eneseloome võimusuhetes: Agambeni, Badiou ja Foucault subjektsuseteooriad semiootilisest vaatepunktist 1

Mobiiliäpid turunduses must auk?

Tartu Ülikool Sotsiaal- ja Haridusteaduskond Haridusteaduste Instituut Eripedagoogika õppekava. Anne Mereküla

Andmebaaside projekteerimiseks kasutatavad mudelid

TARTU ÜLIKOOL SOTSIAALTEADUSTE VALDKOND NARVA KOLLEDŽ ÜHISKONNATEADUSTE LEKTORAAT

IT-revolutsiooniks Gartneri uuring Nõuandeid

ГУ ISSN Vikerkaar 1/1988

MAJANDUSLIKE OSTUOTSUSTE MÕJUTAMINE AASTASTE NOORTE NÄITEL

HIVi nakatunute infektsionisti ravilt lahkumise põhjused

LOOMADE POOLT Kadri Taperson

Armu teile ja rahu Jumalalt, JEESUS VAIGISTAB TORMI! PIIBLIKOOL LASTEKESKUS. Tervitus! Vägi meie kätes. Lõpeta kohtumõistmine

Innovatiivse teenuse väärtusloome Fits.me juhtumi näitel

Katre Kõvask: Ühtne tarkvara hoiab kõvasti meie aega kokku. Premia Foodsi juhatuse esimees. Mobile Loyalty lahendus, mis tagab konkurentsieelise

SÕNAJÄRG, INFOSTRUKTUUR JA OBJEKTI KÄÄNE EESTI KEELES

Noorsootöö muutuvas maailmas NOORTE VABATAHTLIK TEGEVUS ETTEVÕTLIKKUS MIHUS 06/11 1

KÄRGPERES ELAVAD LAPSED: LAPSE PERSPEKTIIV

Ajakiri Sotsiaaltöö 2001/5 Eessõna

Fotod. Arno Saar, 2008 Harri Rinne and WSOY Järelsõna eestikeelsele väljaandele. Harri Rinne, 2008 Tõlge eesti keelde. Sander Liivak, 2008

probleemidest tuleb rääkida kohe LK 34 Mobiilisõbralik koduleht toob kliendid teie juurde

Tartu Ülikool Geograafia Instituut

Kursuseprogrammide haldamise keskkonna nõuete analüüs ja disain

TÖÖTAJATE RAHULOLU- JA MOTIVATSIOONIUURING OÜ KÄPP GRUPP NÄITEL EMPLOYEE MOTIVATION AND JOB SATISFACTION IN THE EXAMPLE OF KÄPP GRUPP

Indrek Otsus Ott Kiivikas

KORPORATIIVBRÄNDI KASUTAMINE ÄRITURUL AS SCANDAGRA JUHTUM USING CORPORATIVE BRAND ON THE BUSINESS MARKET THE CASE OF AS SCANDAGRA

SPORDIORGANISATSIOON JA -KORRALDUS

MARTIN HEIDEGGERI JA JEAN-PAUL SARTRE I EKSISTENTSIKÄSITLUS

TARTU ÜLIKOOL Sotsiaal- ja haridusteaduskond Sotsioloogia ja sotsiaalpoliitika instituut

Juhtimine. Juhi Sina majandust! TTÜ majandusteaduskond annab selleks parima hariduse! TEADMISTE KAUDU EDUKAKS!

Eesti Ettevõtluskõrgkool Mainor. Ettevõtluse Instituut Turunduse eriala

*** Vene keelest tõlkinud Märt Väljataga

DEVELOPING METHODS FOR ANALYSIS AND EVALUATION OF REGRESSION TESTING PROCESS

Privaatsus sotsiaalvõrgustikes. Privacy in Social Networks. Bakalaureusetöö. Autor: Polina Rubtsova. Juhendaja: Birgy Lorenz. Autor:...

Avasta. Maailma 2017/2018

enn põldroos silm veresoonega jutud tallinn

Tiraaž 1000 eks. Levitatakse tasuta

MONDAY, JANUARY 29, 2007

Rahakoti funktsionaalsuste ID-kaardile ja nutitelefonile lisamise analüüs

AASTAST 1925 HUGO TREFFNERI GÜMNAASIUM JUUNI 2016 MIILANG

Ideelabor sai uue värvilise kuue

11. AASTAKÄIK 1999 NUMBER 8

STATISTILINE OLULISUS VALIMIVÕTT JA VALIMIMAHT

Nutiseadmete kasutajate turvateadlikkuse ja turvalise käitumise uuring. Uuringuaruanne TNS Emor. Tellija: Riigi Infosüsteemi Amet

TÄNUSÕNAD PIIRID PUUDUVAD

LAPS LASTEKAITSETÖÖ KLIENDINA LASTEKAITSETÖÖTAJATE KÄSITUSES

omaan Kristjan Indus

Eesti Mets. Hunti. toidavad jalad

Vajame inimesi, kes oskaksid iseseisvalt õppida.

B.E. Haley and T. Small/Medical Veritas 3 (2006) 1 14

SÄUTSUDE JA PIIKSUDE TAGA TULEB NÄHA LIHAST JA LUUST INIMEST

Noorte Uurides identiteeti ning selle rolli rahvusvahelises noorsootöös mõistmine

Arvutikasutaja motoorsete andmete abil järelduste tegemine

FOORUMTEATER JÕUSTAMISMEETODINA

INTERAKTIIVSE SISUPAKETI LOOMINE UDUTU ABIL: VÕIMALUSED JA KITSASKOHAD

TeeLeht aasta suuremad teetööd. Korruptsioon ja Maanteeamet. Tee annab tööd küll, jätkuks vaid tegijaid. Tuhandete kilomeetrite võrra targemaks

ÕPPEKAVA INTEGRATSIOONI VÕIMALUSI. Tiina Kuusk, pedagoogikamagister, Valjala Põhikooli vanemõpetaja

leoter-muusiko-kin ю ISSN ENSV Kultuuriministeeriumi,

VARIATIONS IN TACTILE SIGNING THE CASE OF ONE-HANDED SIGNING

Adaptation of the KOOS questionnnaire for the use in Estonia Ann Tamm University of Tartu, Estonia ;

15 : SUVI. tartu ja maailma kultuurileht VIIETEISTkümnes number : SUVI 2011 Kolleegium: Kaisa Eiche, Indrek Grigor, Põim Kama,

Tartu Ülikool Sotsiaal- ja Haridusteaduskond. Haridusteaduste õppekava. Ave Viirma

Kaastööd VÄRSKE RÕHU TOIMETUS

Noorsootöö identiteet ja tulevik

Lülisamba traumaatiline vigastus (TLICS) 5. veebr Erki Parri

Transcription:

Ühes rakenduses on andmete töötlemisel harva vaja kasutada kõiki loenditel tehtavaid operatsioone korraga. Lisaks võivad erinevad loenditüübid olla juba keeles olemas ja vajadust neid kirjeldatud viisil üles ehitada tegelikult ei ole. õige tihedamini on vaja elemente lisada ja eemaldada loendi otstes. Sellest lähtuvalt on kujunenud 3 enim kasutatavat lineaarset andmestruktuuri koos iseloomulike omaduste ja operatsioonidega: pinu, järjekord ja dekk. Just selllised lineaarsed struktuurid on kõige efektiivsemad. Järgnevas peatükis kirjeldatakse nimetatud andmestruktuuride ülesehitust, realiseerimise võimalusi ning kasutamisvõimalusi. Magasin e. pinu Magasin e. pinu (stack) on lineaarloend, kuhu elemente lisatakse ja kust elemente kustutatakse ühest ja samast otsast, pinu tipust (top). Andmete kättesaamine toimubki sel teel, et element eemaldatakse pinust. Nimi magasin tuleb sarnasusest automaadi magasiniga. es pole magasini näinud, siis selgituseks sobib ka tsekkide toppimine ora otsa nagu kunagi kooli sööklates, apteekides ja poodides tehti (mida te võib-olla samuit näinud ei ole :) ). õigil toodud näidetel on ühisteks omadusteks tšeki või padruni, mis esimesena sisse või ora otsa pandi, saab kätte kōige viimasena ja vastupidi viimasena paigaldatud eseme saab kätte esimesena (kui just mitte lõhkuma hakata). See ongi magasini pōhimōte. Sellist tüüpi struktuuri kutsutakse inglise keeles ka last-in-first-out (LIFO) struktuuriks (mõiste ja tööpõhimõte pole kasutusel ainult tarkvara juures, vaid ka riistvaras ja mujal). Pinu operatsioonid 1. Lisada element pinusse (push) 2. Eemaldada element pinust (pop) Lisaks: 3. Uue pinu loomine. 4. ontroll, kas pinu on tühi. 5. ontroll, kas pinu on täis (ruum uute elementide lisamiseks on otsa saanud). Igasugused muud variandid nagu näiteks pinu keskele elemendi lisamine või keskelt vaatamine ja kustutamine on keelatud. Ettenähtud ei ole ka pinu läbimist. ui juba andmeid on kasutada vaja, siis eemaldatakse vastav element pinust. Väljakujunenud terminoloogia kohaselt räägitakse pinu tipust (top) ja põhjast (bottom) ning teda kujutatakse vertikaalse struktuurina. Näide: asutame pinu sõna tagurpidi pööramiseks: Tühi pinu Paneme sisse tähed UI I U Võtame I välja (pop()) Paneme sinna (push()) U Võtame U välja (pop()) U Paneme sinna U (push(u)) Võtame välja (pop()) I U Paneme sinna I (push(i)) Pinu on tühi. Väljundiks on IU Pinu kasutamine una pinu on üsna spetsiifiline struktuur, siis leiab ta kasutamist peamiselt erinevates arvutiteaduslikes rakendustes. Näiteks protseduuride väljakutsete organiseerimine. Nö pooleli jäänud alamprogramm pannakse pinusse koos oma muutujate komplektiga. Ja selliselt kõik pooleli jäänud alamprogrammid üksteise otsa. ui nüüd ühe alamprogrammi Inga Petuhhov TLÜ 1/7

täitmine lõpeb, siis võetakse tema asemel pinust eelmine alamprogramm, mis lõppenu välja kutsus jne kuni pinu tühjaks saab (vahepael võidakse vajaduse korral ka uusi alamprogramme juurde lisada). ompilaator töötleb aritmeetilisi avaldisi pinu abil. Näiteks saab sulge mugavalt uurida. Seega on võimalik sarnaselt ka ise mõnda avaldise interpretaatorit koostada. Üldiselt saab pinu kasutada igasuguse info tagurpidi pööramiseks. Loomulikult ei pea üks pinu element olema üksik täht, vaid nagu see on üldse loendite korral kirjed, millel on ühtne struktuur. Poola notatsioon (Polish notation) 1951 a pakkus Poola loogik Jan Lukasiewicz välja, kuidas panna kirja loogikaavaldisi sulge kasutamata. Notatsioon levis ka algebrasse ja mujale, kus operaatoreid-operande kirja vaja panna. Süsteem sai nimeks Poola notatsioon (Polish notation). irjapildi idee on selles, et kui operaatorid panna operandide ette või järele ja kui operaatori poolt töödeldavate operandide hulk on üheselt määratud, saab hakkama sulge kasutamata. Algselt pandi operaatorid operandide ette. Edasi viidi operaatorid operandide järgi ja seda kutsutakse pööratud Poola notatsiooniks (reverse Polish notation). okkuvõttes võib öelda, et nii loogika kui ka aritmeetikaavaldisi saab kirja panna kolmel erineval kujul: prefiks (+ab), postfks (ab+) ja infiks (a+b) kujul. Need on alternatiivsed mõisted Poola ja pööratud Poola kujule. Meeldetuletuseks: operaator on teisisõnu tehtemärk, operand aga see, millega opereeritakse mingi väärtus. Näide: Infiks notatsioon on(a*b)+c,sama avaldis postfiks notatsioonis oleks ab*c+ Aritmeetika-avaldiste arvutamine Aritmeetika-avaldiste arvutamiseks muudetakse nad kompilaatorite poolt tihti sulgudeta postfiks notatiooni. Seejärel kasutatakse pinu avaldise väärtuse leidmiseks. Pinus hoitakse operande. Arvutusreeglid on väga lihtsad: 1. Töötle avaldises olevaid operaatoreid ja operande vasakult paremale 2. ui tegemist on operandiga, lisa ta operandide pinusse. 3. ui tegemist on operaatoriga, võta pinust välja kaks operandi ja rakenda neile vastavat operaatorit. Ainus koht, kus aritmeetikaavaldiste puhul probleem tekib on miinus-märgi kasutamine. Tavaliselt lahendatakse see nii, et miinust loetakse unaarseks operaatoriks ja käsitletkse koos arvuga. Lahutamine pannakse aga kirja a+(-b), ehk postfiksnotatsioonis: a-b+ (kus miinus kuulub b-ga kokku) i tehnika sõltub kasutamiseesmärgist ja programmeerimiskeelest. On tüüpiliselt kaks võimalust: 1. Staatiline meetod kasutades massiivi. Sel juhul on pinu maht piiratud massiivi elementide arvuga (kui massiiv ise on staatiline). Pinu tipu meeles pidamiseks tuleb arvet pidada täidetud massiivielementide üle. Tegemist on staatilise mälukasutusega. Pinu elemendid on füüsiliselt järjestikku. 2. Dünaamiline meetod kasutades ühe viidaga loendit. Sel juhul tuleb otsustada, kumba pidi viidad jooksevad, et push ja pop protseduure lihtsam kirjutada oleks. Piisab ühest viidast pinu tipule, et temaga peamisi operatsioone teha. Massiiv Massiivi lahter sisaldab infot pinu ühe elemendi kohta. Tühja pinu tähistab pinu tipu (indeksi) võrdumine 0 (nulliga). ui uus element lisatakse pinusse, suurendatakse tipu väärtust ühe võrra ja uus element salvestatakse massiivi vastavasse lahtrisse. Elemendi eemaldamiseks tuleb elemendi väärtus sellest lahtrist, kuhu tipp näitab, välja võtta ja tippu nihutada koha võrra ettepoole (-1). Tipu väärtuse järgi saab jälgida, et pinu ei täituks üle ega alla. Ehkki tehniliselt on kõik massiivi lahtrid suvalisel hekel indeksite kaudu ligipääsetavad, tuleb seada nö loogiline tõke ja toimetada pinuga ainult tema tipu indeksi kaudu, teda vajaduse korral suurendades või vähendades. Ainus element, mida pinust võtta võib on see, mis paikneb tipu indeksiga määratud lahtris. Ühe viidaga loend Dünaamilise realisatsiooni korral ei pea elemendid paiknema füüsiliselt järjestikku, vaid järgnevusseose määravad lingid ehk viidad. Et loendiga on seotud üks väline aadress, milleks on loendi esimese elemendi mäluaadress, võiks see sama aadress sobida ka pinu tipule ligipääsemiseks. Edasi on oluline, et pinusse oleks mugav elemente juurde lisada ja neid sealt eemaldada (pinu põhioperatsioonid). Ilma et peaks selleks kogu loendit algusest lõpuni läbi käima. i seisukohast on kokkuvõttes mugavam, kui elemendid viitavad olemasoleva pinu poole (nö alla poole). (Miks see nii on, mõtle ise välja.) Inga Petuhhov TLÜ 2/7

Top Pilt nr 1 Pinu ühe viidaga loendina. Algoritmiliselt on lisamine ja kustutamine selged üldise loendite jutu juurest. Sisuliselt on siis tegemist elemendi lisamisega loendi algusesse ja elemendi kustutamisega loendi algusest Järjekord e. saba Järjekord e. saba (queue) on lineaarloend, kus elementide lisamine toimub alati loendi ühes otsas ja elementide eemaldamine teisest otsast. Reeglina pääseb andmetele vaatamiseks ligi vaid selles otsas, kust toimub eemaldamine. Järjekord on igapäevases elus üsna tavaline andmestruktuur. Näiteks eksisteerib järjekord arsti juurde ja meil on vaja opereerida selle järjekorra andmetega. Iga inimese andmed moodustavad selles järjekorras ühe ühiku. Inimese seisukohast vaadatuna toimub järjekorras olemine selliselt, et inimene tuleb vastuvōturuumi ja nähes seal teisi inimesi, esitab küsimuse "es on viimane?". Seejärel jätab ta vastanud inimese näo meelde ja on valmis järgmisele tulijale vastama, et tema ise nüüd viimane on. Pärast seda, kui tema järele tuleb vähemalt üks inimene, jälgib ta ainult seda, millal tema ees olev isik vastu vōetakse. Mis toimub järjekorras peale teda enam huvi ei paku. üll on aga kogu järjekord väga huvitatud sellest, et mitte keegi vahele ei trügiks. Järjekorda kutsutakse inglise keeles ka first in first out (FIFO) struktuuriks: kes esimesena järjekorda lisatakse (first in), see teenindatakse samuti esimesena (first out). Järjekorra operatsioonid 1. Lisada element järjekorra lõppu. 2. Eemaldada element järjekorra algusest Lisaks: 3. Uue tühja järjekorra loomine. 4. ontroll, kas järjeord on tühi. 5. ontroll, kas järjekord on täis. Nagu näha, on operatsioonid sarnased pinuga. Põhimõtteline vahe ongi selles, kuhu elemente juurde panna ja kust ära võtta. Terminoloogias räägitakse tavaliselt järjekorras olemisest, järjekorra algusest ja lõpust ning visuaalselt kujutatakse järjekorda horisontaalse struktuurina. Järjekorra kasutamine Järjekorda kasutatakse siis, kui andmed saabuvad kindlas järjekorras ja see järjekord on oluline ka nende töötlemisel. Näiteks operatsioonisüsteem paneb saabunud käsud järjekorra lõppu ja võtab neid järjekorra algusest täitmiseks (ajajaotussüsteemide puhul). Paljud tegeliku elu probleemid taanduvad järjekorra kasutamisele. Näiteks süsteem, mis lubab lennukile pileteid broneerida. Broneerimissoovid saabuvad erinevaist paigust erinevatel ajahetkedel, samas järjekorras tuleks need soovid ka rahuldada. es veidigi varem seda kohta tahtis peab selle saama. Järjekorral võib olla ka veidi teistsugune iseloom. Näiteks tuuakse välja järgmised erilised järjekorrad: Mitme teenindajaga järjekord (Multiple server queue); Prioriteetidega järjekord (Priority queue); Piiratud pikkusega järjekord (Bounded length queue). Inga Petuhhov TLÜ 3/7

Nime järgi on võimalik neile reaalelust mingeid vasteid leida. Pikemalt nendest selles kursuses juttu ei tule (välja arvatud prioriteetidega ehk eelistusjärjekorrast) i tehnika sõltub kasutatavast programmeerimiskeelest. On tüüpiliselt kaks võimalust, täpselt nagu oli pinu puhulgi: 1. asutades massiivi. 2. asutades viitadega loendit. Oma olemuselt vastab järjekord rohkem teisele variandile. Massiiv Massiivina realiseerides peab olema kaks indeksit (algus ja lõpp), mille abil järjekorda meeles pidada. Algusesse lisatakse ja lõpust eelmadatakse. ui algus ja lõpp on tagurpidi (lõpp<algus), siis on järjekord tühi. Et massiiv otsa ei saaks, tuleb siis, kui järjekorra algus massiivi lõppu jõuab, tuua ta uuesti massiivi algusesse. Ühe viidaga loend Enne realiseerimisele asumist tuleks teha mõned põhimõttelised otsused: Mitu viita järjekorraga siduda? Ilmselt on kasulik, et viitasid oleks kaks üks algusele (esimene) ja teine lõpule (viimane). Põhjus on järjekorra eripäras, sest ligi on vaja pääseda nii järjekorra algusele kui ka lõpule. Mis pidi panna jooksma viidad? Selleks tuleks joonistada ühe viidaga nimistu ja proovida, kas lisamine ja eemaldamine õnnestuvad. Info Info Info Head Tail Info Info Info Head Tail Pilt nr 2 Järjekord, 2 varianti. Pildil 2 näidatud variantide erinevused on selles, et esimesel juhul jooksevad viidad selliselt, nagu me endale sabas seismist ette kujutame iga järgmine seisja vaatab eelnevale kuklasse või peab meeles tema aadressi (täpselt nagu hambaarsti ukse taga). Teise variandi puhul on eelmise seisja viit suunatud järgmisele (seisjad on tagurpidi, seljaga järjekorra alguse poole). Lisamise ja eemaldamise puhul tekib tavaliselt vajadus abiviida järele. Elemendi lisamine variandi 1 puhul on lihtne. eeruliseks osutub aga elemendi eemaldamine algusest, sest selleks tuleb tsükliga kogu järjekord lõpust algusesse läbi käia ja osuti peatada eelviimasel (tegelikult algusest teisel) elemendil. Edasi on võimalik järjekorras esimene ülejäänud sabast valutult eraldada. Tuleks otsida parem tee ja nagu selgub on kasulikum hoida järjekorda nö tagurpidi nagu variandi 2 puhul joonistatud - eelmine viitab järgmisele ja saba lõppu tähistab (inimesed on sabas teist pidi pööratud). Selline viitade ümberpööramine annab elemendi eemaldamiseks palju parema võimaluse. Inga Petuhhov TLÜ 4/7

Realistasioon Pythonit kasutades Abstraktne andmetüüp Seoses pinu ja järjekorraga tuleks meeldetuletada ka mõiste abstraktne andmetüüp (Abstract Data Type ADT). ADT kirjeldab operatsioonide hulga, mida antud andmetüübiga teha saab ja operatsioonide tähenduse (semantika), kuid ei kirjelda ei andmetüübi enda ega operatsioonide realisatsiooni. Selline abstraktsus (üldistus) on kasulik järgmistel põhjustel: Lihtsustub vastavat andmetüüpi kasutatavate algoritmide üleskirjutamine ning ka programmeerimine, sest ei pea pidevalt mõtlema sellele, kuidas täpselt üks või teine operatsioon realiseeritakse (vt Poola notatsiooni juures esitatud algoritmide kirjeldusi). una ADT-d saab tavaliselt realiseerida mitmel viisil, siis tekib võimalus vajaduse korral realisatsiooni muuta samal ajal muutmata ADT-d kasutava algoritmi loogikat. Tuntumad ja vajalikud ADT-d on tihti keeltes realiseeritud ja teinekord ei olegi vaja hädasti mõtelda sellele, kuidas ADT-d ennast üles ehitada (ehkki kasulik on ikka teada, mis karul kõhus, et otsustada sobivama realisatsiooni üle). ADT-de operatsioonid annavad võimaluse neist algoritmidest rääkida kergemini ka tavakeeles. Pinu Pinu ADT liides (interface) oleks tüüpilisi operatsioonide nimetusi kasutades järgmine: init Uue tühja pinu algväärtustamine push() Lisa uus element pinu tippu. pop() ustuta ning tagasta element pinu tipust. See on viimasena lisatud element. isempty() ontroll, kas pinu on tühi. Üks võimalus pinu realiseerimiseks on kasutada Pythoni listi. Sisuliselt on listil olemas just need operatsioonid, millega pinu teha saab, kui nimed on erinevad. Saavutamaks kooskõla tavalise pinu (stack) ADT-ga on sobilik luua uus klass stack ka kirjeldada liideses nimetatud operatsioonid listi vahendeid kasutades. class Stack : def init (self): self.items = [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def isempty(self): return (self.items == []) onstruktor init lisab pinusse tühja listi nimega item. Push lisab listi append-meetodit kasutades uue väärtuse listi lõppu. Pop eemaldab listi lõpust viimase väärtuse ja tagastab selle. IsEmpty tagastab true, kui list item on tühi. Esialgu võivad kõik uued meetodid mõttetud tunduda, sest sisuks ikka vaid üks lause, kuid sellist liidese standartseks ümberdefineerimist peetakse tarkvaraarenduses ja arvutiteaduses heaks tooniks. Peamine mõte seisnebki nö standratse liidese loomises kasutades tavapärasteid pinu operatsioonide nimesid. Pinuga tuttav inimene mõistab pinu-klassi kasutavat koodi kindlasti paremini kui Pythoni originaalkäske listi kallal. Eriti siis, kui Python veel tema kodune keel ei ole. Teisalt võib olla ka vajalik eristada seda, et ADT toodab üks inimene/team ja kasutab teine. Nad ei tohiks olla üksteisest rohkem sõltuvad, kui ainult ADT liidese ulatuses. Tootja peab tagama ADT töökindluse ja läbi liidese esitatava funktsoinaalsuse. asutaja tohib ADT-d kasutada vaid liidese kaudu. Tulemuseks on see, et tootja võib muuta realisatsiooni liidese taga ilma et see mõjutaks kasutaja poolt loodud tarkvara toimimist. Inga Petuhhov TLÜ 5/7

Geneeriline andmetüüp (Generic data structure) irjeldatud andmetüüp stack on geneeriline (üldine) andmetüüp. See tähendab, et ei ole paika pandud, millist tüüpi andmeid pinus hoida tuleks. Seda saab otsustada alles siis, kui pinu juba kasutuses on. Et Pythoni listi võib lisada erinevat tüüpi andmeid segamini, saab sama teha ka antud pinuga. Näited pinu kasutamisest on veebilehel. Siin vaid üks pisike tsükkel, mis juba olemasolevast pinust kõik andmed välja võtab ja ekraanile trükib: while not pinu.isempty() : print pinu.pop(), Järjekord Järjekorra ADT liides on järgmine (sisluliselt sarnased operatsioonid pinuga, kui traditsiooniliselt teised nimed): init Tühja pinu loomine. insert Uue elemendi lisamine remove Viimati lisatud elemendi kõrvaldamine ja väärtuse väljastamine isempty ontroll, kas saba on tühi. Edasi on vaja meetodid realiseerida ja järjekord ehk saba on kasutatav. Dekk e. kaheotsaline järjekord Dekk (deque, double-ended queue) on lineaarloend, kus elementide lisamine ja eemaldamine on lubatud mõlemast otsast. Samuti on mõlemast otsast lubatud juurdepääs andmetele. Dekki nimetatakse magasini ja järjekorra üldistuseks. Üldistus tähendab seda, et eemaldamine ja lisamine on lubatud dekki mõlemast otsast. Terminoloogias räägitakse deki vasakust ja paremast otsast ja kujutatakse teda horisontaalselt. Eristatakse veel kahte piiratud varianti: piiratud väljundiga (output-restricted deque) ja piiratud sisendiga (inputrestricted deque) dekki. St, et vastav tegevus piiratakse ühe deki otsaga. Deki operatsioonid: 1. Lisada element järjekorra algusesse. 2. Lisada element järjekorra lõppu. 3. Eemaldada element järjekorra algusest 4. Eemaldada element järjekorra lõpust. Lisaks: 5. Uue tühja deki loomine. 6. ontroll, kas dekk on tühi. 7. ontroll, kas dekk on täis. asutamine Sobib siis, kui pinu või järjekorra võimalused piiratuks jäävad. Võimalik on kasutada nii massiivi kui ka viitadega loendit, kuid massiivi puhul muudab olukorra ebamugavaks see, et lisada peab saama mõlemasse otsa. Seetõttu on viitadega loendi kasutamine loomulikum. uid juba järjekorra realiseerimisel sai selgeks, et igasugune ühe viidaga loend hästi ei sobi viitade ühtpidi suunatuse tõttu. õigi operatsioonide mugavamaks korraldamiseks tuleks kasutusele võtta hoopis kahe viidaga loend. ui meil on selged operatsioonid kahe viidaga loendi peal, siis rohkem probleeme ei tohiks ka deki haldamine tekitada. indlasti peab dekiga seotud olema 2 viita vasakule ja paremale otsale, et lisamisi ja eemaldamisi mõlemas otsas mugavamalt teha. Inga Petuhhov TLÜ 6/7

Info Info Info Head Tail Pilt nr 3. aheotsaline järjekord, mis moodustatakse kahe viidaga loendi abil. Ringjärjekord Ringjärjekord (Circular queue) on andmestruktuur, mille erisuseks on see, et viimane ja esimene element on omavahel seotud. Mõne rakenduse seisukohalt on just selline järjekord parim. Samal ajal saab ringjärjekorra abil imiteerida ka tavalist järjekorda, ainult et järjekorraga on seotud vaid üks viit, mis korraga nii algusele kui lõpule näitab. Ring Pilt nr 5. Ühe viidaga ringjärjekord. Algust (ja lõppu) tähistab viit Ring. a sellise struktuuri puhul on realisatsiooniks kasutatavad nii massiiv kui ka viitadega nimistu. Massiivi abil ringloendi realiseerimisel soovitatakse kasutada elemendi indeksi määramiseks täisarvulist jagamist (jagatakse tegeliku elementide arvuga). Sel juhul pääseb andmete nihutamisest mööda massiivi. Piiriks võib saada näiteks täisarvulise indeksimuutuja ületäitumine. Realiseerimiseks viitadega loendi abil piisab ühe viidaga ringloendist, kus järjekorra algust ja lõppu tähistab üks väline viit. Võrdleme üldiste lineaarloendite realiseerimist massiivi ja viitadega 1. Viida jaoks tuleb elemendis eraldada lisaks üks või kaks välja, mis mälu võtab. ui aga loendeid on mitu, siis saavad nad kasutada vaheldumisi sama mälupiirkonda. Viitadega realisatsioon on tavaliselt efektiivsem, sest pole vaja igaks juhuks mälu eraldada. 2. Elemendi lisamine vahele on lihtsam selleks tuleb vaid uus element tekitada ja viidad ringi tõsta. Massiivi puhul tuleks aga nö paremal paiknevad elemendid enne edasi nihutada. 3. Elemendi eemaldamiseks on samuti vaja ainult viidad ringi tõsta, massiivi puhul aga mälupesade sisud ringi kirjutada. 4. Suvalise k-nda elemendi poole pöördumine on järjestikuse paiknemise puhul lihtsam ja kiirem aeg on konstantne, viitadega struktuuri korral sõltub pöördumise aeg k suurusest, st tuleb teha k kordust, et õiget elementi kätte saada. 5. Viitadega realisatsiooni korral on kergem organiseerida nimistute ühendamist ja nimistute lõhkumist mitmesse ossa, mis hiljem iseseisvalt kasvada/kahaneda saavad. 6. Viitadega realisatsiooni korral saab lineaarloendit organiseerida palju keerulisemaid struktuure: näiteks linkides iga loendi elemendiga terve uue loende. 7. Loendi läbimine toimub tavaliselt kiiremini järjestikulise paiknemise (massiivi) korral. Inga Petuhhov TLÜ 7/7