Podatkovne strukture - SKLAD

Podatkovne strukture - SKLAD

Avtor: Matija Lokar

Sklad

(2.png)

Sklad

  • skladovnica zabojev
  • Držalo PEZ bonbonov
  • nabojnik, držalo za krožnike, hodnik brez izhoda, …
  • Prvi noter, zadnji ven
  • zadnji noter, prvi ven – LIFO (Last In First Out)

Kaj APS je in zakaj jo potrebujemo

  • Za reševanje nekega problema potrebujemo prostor za hranjenje podatkov, ki se bo obnašal tako kot sklad (skladovnica, upošteval princip LIFO)‏
  • Če bomo programirali v C#– potrebujemo objekt iz razreda Sklad
  • V razredu Sklad morajo biti metode, ki delujejo tako, kot pričakujemo od sklada.
  • Dejanski način predstavite podatkov znotraj objekta nas čisto nič ne zanima – potrebujemo le ustrezne metode!
  • Če bomo delali v kakšnem drugem programskem jeziku bo predstavitev sklada sicer drugačna kot v Javi, a ustrezne metode (podprogrami, funkcije, ..) se bodo morali “obnašati” v skladu s principom LIFO.

Podatkovne strukture

  • podatki
  • operacije nad podatki
  • lastnosti operacij
  • neodvisnost od dejanske predstavitve KAJ je struktura in ne KAKO jo predstaviti
  • ABSTRAKTNE PODATKOVNE STRUKTURE
  • Abstract Data Type (ADT)‏

Sklad

  • Podatke vstavljamo in jemljemo iz sklada na enem koncu
  • Operacije:

    • pripravi sklad (običajno klic konstruktorja)
    • vstavi element v sklad (push)‏
    • poglej element na vrhu sklada (peek, top)‏
    • odstrani element na vrhu sklada (pop)‏
    • je sklad prazen (empty)‏

Uporaba sklada

  • Obiskane strani v brskalniku
  • Zaporedje UNDO ukazov
  • računalniški sklad (rekurzija, dodeljevanje pomnilnika ob klicu funkcij, …),
  • Sklad klicev metod
  • Pomožni pomnilnik pri različnih algoritmih
  • Nastopa kot del drugih podatkovnih struktur

Delo s skladom

  • S pomočjo osnovnih operacij nad skladom preštej število podatkov v skladu – sklada po tem ne potrebjemo več.
  • S pomočjo osnovnih operacij nad skladom preštej število podatkov v skladu – sklada naj ostane nespremenjen.
  • Obrni vrstni red elementov v skladu.
  • Za vsak element v skladu pokliči metodo obdelaj, ki kot argument sprejme element sklada. Sklada po koncu ne potrebujemo več.
  • Za vsak element v skladu pokliči metodo obdelaj, ki kot argument sprejme element sklada. Sklada mora ostati nespremenjen.

Delo s skladom

  • S pomočjo osnovnih operacij nad skladom sestavi operacijo n-ti, ki vrne podatek o n-tem element v skladu, če obstaja. Sklada potem ne potrebujemo več!
  • Odstrani n-ti element iz sklada – sklad ima po operacij vse podatke tako kot prvotno, le n-tega ni.
  • V dveh skladih so podatki urejeni. Sestavi metodo, ki jih preloži v nov sklad v katerem so podatki tudi urejeni (v enakem vrstnem redu).
  • Preloži elemente iz tabele v sklad.

N-ti

n_ti: (sklad, int) podatek

public Podatek n_ti(n) {
  // vrne n-ti podatek tipa Podatek v nizu
  if this.prazen() NAPAKA
  else  {
     pod = this.vrh();
     this.odstrani();
     if (n == 1) return pod; // če iščemo prvega, je to vrhnji
     else
        return n_ti(n-1); // v preostanku sklada poiščemo n-1 tega
   }
 }

N-ti

  • Operacija “uniči” sklad
  • Seveda možna nerekurzivna različica!
  • “Nedestruktivna” oblika:

    • Zgornjih n – 1 elementov je napoti
    • Preložimo jih v pomožni sklad
    • Odstranimo element (n-ti)‏
    • Preložimo elemente iz pomožnega sklada nazaj

.NET in sklad

  • V ogrodju .NET že obstaja razred Stack.

    • using System.Collections;
  • Pozna metode:

    • Peek <=> vrh
    • Pop <=> odstrani (+ vrh)
    • Push <=> vstavi
  • In lastnost

    • skl.Count != 0 <=> prazen

Zgled

using System.Collections; // za običajen sklad

// demonstracija uporabe sklada
Stack mojS = new Stack();
mojS.Push("To"); mojS.Push("je");
mojS.Push("Matija"); mojS.Push("Lokar");
mojS.Push("4000"); mojS.Push("Kranj");
Console.WriteLine("V skladu je " + mojS.Count + " podatkov.");
// izpis
string pod = (string)mojS.Pop(); // sami moramo pretvoriti podatek nazaj v ustrezni tip
Console.WriteLine("Na vrhu v skladu je bil: " + pod);
Console.WriteLine("V skladu je sedaj " + mojS.Count + " podatkov.");
string podPoglej = (string)mojS.Peek(); // sami moramo pretvoriti podatek nazaj v ustrezni tip
Console.WriteLine("Na vrhu v skladu je : " + podPoglej);
Console.WriteLine("V skladu je še vedno " + mojS.Count + " podatkov.");

(13.png)

Izpiši vsebino sklada (in sklad ohrani)

  • Potrebovali bomo pomožni sklad
  • Zanka

    • Vzamemo element s sklada
    • Ga pretvorimo v niz in izpišemo
    • Vstavimo v pomožni sklad
  • Nato prepišemo še pomožni sklad v prvotnega
  • S tem “restavriramo” tudi vrstni red elementov

IzpisSklada

public static void IzpisSklada(Stack skl)
{
    Stack novSk = new Stack();
    Console.WriteLine("..... VRH .....");
    while (skl.Count > 0) // dokler sklad ni prazen
    {
        string elt = (string)skl.Pop(); // vzamemo in odstranimo
        Console.WriteLine(elt);
        novSk.Push(elt); // vstavimo v pomožni sklad
    }
    Console.WriteLine("..... DNO .....");
    // prelagamo nazaj
    while (novSk.Count > 0) // dokler sklad ni prazen
    {
        string elt = (string)novSk.Pop(); // vzamemo in odstranimo
        skl.Push(elt); // vstavimo nazaj v prvotni
    }
}

Test - IzpisSklada

static void Main(string[] args)
{
  Stack mojS = new Stack();
    mojS.Push("To"); mojS.Push("je");
    mojS.Push("Matija"); mojS.Push("Lokar");
    mojS.Push("Kranj");
    Console.WriteLine("V skladu je " + mojS.Count + " podatkov.");
    // izpis
    Console.WriteLine("\nSklad - izpis\n");
    IzpisSklada(mojS);
    Console.WriteLine("\nSklad - ponovni izpis - kontrola\n");
    IzpisSklada(mojS);
}
(16.png)
0%
0%