Sklad in vrsta

Sklad in vrsta

Avtor: Tatjana Mustar

Kazalo

Sklad

Sklad je podatkovna struktura, ki deluje po načelu LIFO (Last In First Out - zadnji noter, prvi ven). To pomeni, da podatek, ki je zadnji prišel v sklad, ga bo tudi prvi zapustil.

Parameter element nam predstavlja podatkovni tip podatkov, ki jih shranjujemo na sklad in je lahko integer, string, ...

(knjige.png)

Operacije nad skladom

Nad skladom imamo naslednje operacije:

Pripravikreira nov prazen sklad
Vstavidoda element na vrh
Odstraniodstrani zgornji element
Vrh(kazalec na) vrhnji element
JePrazenali je sklad prazen
StElementov*
StElementov* običajno ni del signature sklada
število elementov na skladu
(graf.png)

Signatura operacij na skladu

  • Pripravi: Sklad
  • Vstavi: Sklad Element Sklad
  • Odstrani: Sklad Sklad
  • Vrh: Sklad Element
  • JePrazen: Sklad Boolean
  • StElementov*: Sklad
  • StElementov običajno ni del signature sklada.

    (cekini.png)

Aksiomi za sklad

  • JePrazen[Pripravi[]] := True
  • JePrazen[Vstavvi[s_,e_]] := False
  • Vrh[Pripravi[]] := Null
  • Vrh[Vstavi[s,e]] := e
  • Odstrani[Pripravi[]] := Pripravi[]
    (*Lahko bi ugotovili napako.*)
  • Odsrani[Vstavi[s,e]] := s
    (* s Sklad, e Element*)
(drva.png)

Osnovni hipotezi

  • Vsaka implementacija sklada mora zadoščati tem aksionom.

  • Uporaba sklada lahko poteka zgolj preko teh opreacij. Vsako poseganje v notranjo zgradbo sklada pomeni v bistvu NOVO podatkovno strukturo!
(kocke.png)

Implementacija

(Slika1.png)

Naloga

Napiši program, ki vrne dolžino sklada (=StElementov). Pri tem uporabi samo operacije nad skladom.

(genij.png)

Prosta implementacija sklada

  • Sklad predstavimo kot sintaktično pravilni izraz tipa "Sklad".
  • S = Vstavi[Vstavi[Pripravi[], "a"], "b"]
  • T = Odstrani[Vstavi[Vstavi[Vstavi[Pripravi[], "a"],"b"],"c"]]
  • Sklada S in T sta enaka!
  • Vrh[S] "b"
  • JePrazen[S] False
  • Vrh[Odstrani[S]] "a"

Implementacija sklada s tabelo

(shema3.png)


  • Vstavi[s,e]
  • vrh := vrh + 1
  • svrh := e
  • Podobno sprogramiramo ostale opreacije.
  • Pozor: Paziti moramo na prekoračitev obsega.

Vrsta

Vrsta je podatkovna struktura, ki deluje po načelu FIFO (Frst In First Out - prvi noter, prvi ven). To pomeni, da podatek, ki je prvi prišel v vrsto, ga bo tudi prvi zapustil.

(shema.png)

Operacije nad vrsto

Nad vrsto imamo naslednje operacije:

Pripravikreira novo prazno vrsto
Vstavidoda element na rep
Odstraniodstrani čelni element
JePraznaali je vrsta prazna
Čelo(kazalec na) čelni element
Rep(kazalec na) repni element

Signatura operacij na vrsti

  • Pripravi: Vrsta
  • Vstavi: Vrsta Element Vrsta
  • Odstrani: Vrsta Vrsta
  • JePrazen: Vrsta Boolean
  • Čelo: Vrsta Element
  • Rep: Vrsta Element

Aksiomi za vrsto 1/2

  • Odstrani[Pripravi[]] := Pripravi[]
  • Odstrani[Vstavi[v,e]] := If[JePraPripzna[v],
    Pripravi[], Vstavi[Odstrani[v],e]]
  • Čelo[Pripravi[]] := Null
  • Čelo[Vstavi[v,e]] := If[JePrazna[v], e, Čelo[v]]
  • Rep[Pripravi[]] := Null
  • Rep[Vstavi[v,e]] := e
  • JePrazna[Pripravi[]] := True
  • JePrazna[Vstavi[v,e]] := False

Aksiomi za vrsto 2/2

Namesto

  • Odstrani[Vstavi[v,e]] := If[JePrazna[v],
    Pripravi[], Vstavi[Odstrani[v],e]

    bi lahko pisali
  • Odstrani[Vstavi[Pripravi[],e]] := Pripravi[]
  • Odstrani[Vstavi[Vstavi[v,x],y]] :=
    Vstavi[Odstrani[Vstavi[v,x]],y]

Implementacija vrste

Prosta immplementacija vrste

  • Podobno kot pri skladu

    Implementacija s tabelo
  • Linearna predstavitev.
  • Dobra implementacija je zahtevnejša kot pri skladu, paziti moramo na prekoračitev obsega.

Implementacija vrste s tabelo

(shema2.png)
  • Oba kazalca (čelo in rep) potujeta v desno
  • Ko v vrsto dodajamo elemente, jih dodajamo na rep, ki potuje v desno.
  • Ko elemente brišemo iz vrste, jih brišemo iz čela. Čelo potuje v desno.
  • Slej ko prej zapolnemo tabelo (z repom pridemo skrajno v desno). Sproščeni prostor v tabeli levo od čela je neizkoriščen.
  • Teh težav pri skladu nimamo, saj na sklad dajemo in jemljemo iz istega konca.

Implementacija vrste s krožno tabelo

  • Tabelo "zvijemo" - konca tabele staknemo. Računamo po modulu velikosti tabele.
  • Paziti moramo kdaj je vrsta prazna in kdaj polna.
  • vrsta je polna, ko rep sreča čelo (rep + 1) mod n == čelo
  • v vrsti je en sam element, ko je rep == čelo
  • če ga odstranimo, je vrsta prazna in (rep + 1) mod n == čelo

  • Za ločevanje zgornjih primerov
  • Uporabimo posebno spremenljivko.
  • Izrabimo mesto v tabeli. Odločimo se, da kaže na posebnomesto za zadnjim elementom v tabeli (stražar).
(krozna.png)

  • Implementacijo lahko malo "polepšamo", če posebej obravnavamo premike indeksov v krožni tabeli in uvedemo "iteratorje":
  • Prvi, Naslednji, Prejšnji
  • Potem lahko pišemo
  • i Prvi[];
  • i Naslednji[i];
  • i Prejšnji[i];

    (tabela.png)
0%
0%