Curs 2- Agenda - Alexandru Ioan Cuza UniversityCurs 2- Agenda Tipuri de date de nivel inalt Liste...

39
Dorel Lucanu Algoritmica si programare Curs 2- Agenda Tipuri de date de nivel inalt Liste liniare Liste liniare ordonate Stiva Coada tipul abstract (LLin, LLinOrd, Stiva, Coada) implementare cu tablouri implementare cu liste simplu inlantuite Aplicatie la conversii de expresii

Transcript of Curs 2- Agenda - Alexandru Ioan Cuza UniversityCurs 2- Agenda Tipuri de date de nivel inalt Liste...

  • Dorel Lucanu Algoritmica si programare

    Curs 2- Agenda

    Tipuri de date de nivel inaltListe liniareListe liniare ordonateStivaCoada

    tipul abstract (LLin, LLinOrd, Stiva, Coada)implementare cu tablouriimplementare cu liste simplu inlantuite

    Aplicatie la conversii de expresii

  • Dorel Lucanu Algoritmica si programare

    Liste liniare: tipul abstract LLinobiecte

    L = (e0,…, en-1), n ≥ 0, ei ∈ Elt (tipul abstract al elementelor)

    operatiilistaVida()

    intrare: nimiciesire

    () (lista cu zero elemente)insereaza()

    intrare:L = (e0,…, en-1), k ∈ Nat, e ∈ Elt

    iesireL = (…ek-1, e, ek,…) daca 0 ≤ k ≤ neroare in caz contrar

  • Dorel Lucanu Algoritmica si programare

    LLin (continuare 1)elimina()

    intrare:L = (e0,…, en-1), k ∈ Nat

    IesireL = (…ek-1, ek+1…) daca 0 ≤ k ≤ n-1eroare in caz contrar

    alKlea()intrare:

    L = (e0,…, en-1), k ∈ NatIesire

    ek daca 0 ≤ k ≤ n-1eroare in caz contrar

  • Dorel Lucanu Algoritmica si programare

    LLin (continuare 2)poz()

    intrare:L = (e0,…, en-1), e ∈ Elt

    iesire:prima pozitie pe care apare e in L sau -1 daca e nu apare in L

    parcurge()intrare:

    L = (e0,…, en-1), o procedura (functie) viziteaza()iesire:

    lista L in care toate elementele au fostprocesate aplicand viziteaza()

  • Dorel Lucanu Algoritmica si programare

    LLin: implementare cu tablouri

    reprezentarea obiectelor L = (e0,…, en-1)

    L este o structuraun camp de tip tablou L.tab pentrumemorarea elementelorun camp L.ultim pentru memorarea pozitieiultimului element

    MAX-1en-1L.tab Elt[MAX] e0 …

    0

    L.ultim Nat

  • Dorel Lucanu Algoritmica si programare

    LLin: implementare cu tablouri: operatii

    insereaza()deplaseaza elementele de pe pozitiile k, k+1, … la dreapta cu o pozitieinsereaza e pe pozitia kexceptii:

    k L.ultim+1 (k > n)L.ultim = MAX

  • Dorel Lucanu Algoritmica si programare

    LLin: implementare cu tablouri: operatii

    procedure insereaza(L, k, e)if (k < 0 or k > L.ultim +1)

    then throw “eroare”if (L.ultim >= MAX)

    then throw “eroare”for j ← L.ultim downto k do

    L.tab[j+1] ← L.tab[j]L.tab[k] ← eL.ultim ← L.ultim + 1

    endtimpul de executie: O(n)

  • Dorel Lucanu Algoritmica si programare

    LLin: implementare cu tablouri: operatii

    parcurgeprocedure parcurge(L, viziteaza())

    for i ←0 to L.ultim doviziteaza(L.tab[i])

    enddaca viziteaza() proceseaza un element in O(1), atunci parcurge proceseaza lista in O(n)

  • Dorel Lucanu Algoritmica si programare

    LLin: implementarea cu liste inlantuite

    reprezentarea obiectelor L = (e0,…, en-1)

    L.prim

    e0 e1 en-1…

    L.ultim

    L structura cu doua campuripointer la primul elementpointer la ultimul element

    un nod p are doua campuri: unul pentru memorarea informatiei: p->elt = eisi unul pentru nodul succesor: p->succ

  • Dorel Lucanu Algoritmica si programare

    LLin: implementarea cu liste inlantuite

    insereaza()parcurge elementele 0, 1,…, k-1insereaza un nou dupa k-1

    creeaza nodulmemoreaza informatiireface legaturi

    exceptiilista vidak=0k=nk n

  • Dorel Lucanu Algoritmica si programare

    LLin: implementarea cu liste inlantuite

    ek-1

    e

    L.prim L.ultim

    e

    e e0

    L.prim

  • Dorel Lucanu Algoritmica si programare

    LLin : implementarea cu liste inlantuite

    procedure insereaza(L, k, e)if (kelt ← eif (k = 0 or L.prim = NULL)then q->succ ← L.prim

    L.prim ← qif (L.ultim = NULL) then L.ultim ← q

    else p ← L.prim; j ← 0while (jsucc; j ← j+1if (j < k-1) then throw “error”q->succ ← p->succ; p->succ ← q if (p = L.ultim) then L.ultim ← q

    end

  • Dorel Lucanu Algoritmica si programare

    LLin: aplicatie

    linie poligonala de punctePunct structura cu doua campuri x si ycrearea unei liste

    procedure creeazaLista(L)L ← listaVida();//citeste nfor i ← 0 to n-1 do//citeste p.x, p.yinsereaza(L, i, p)

    endatentie: timpul de executie depinde de implementare

  • Dorel Lucanu Algoritmica si programare

    LLin: aplicatie

    multiplica cu 2 coordonatele unui punctprocedure ori2Punct(p)

    p.x ← p.x * 2p.y ← p.y * 2

    endmultiplica cu 2 coordonatele unei liniipoligonala

    procedure ori2Linie(L)parcurge(L, ori2Punct())

    end

  • Dorel Lucanu Algoritmica si programare

    LLin: aplicatie

    translateaza punctprocedure trPunct(p, dx, dy)

    p.x ← p.x + dxp.y ← p.y + dy

    endtranslateaza linie poligonala

    procedure trLinie(L, dx, dy)parcurge(L, trPunct(), dx, dy)

    end… totusi presupune modificarea proceduriiparcurge

  • Dorel Lucanu Algoritmica si programare

    Liste liniare ordonate: LLinOrd

    obiecteL = (e0,…, en-1), n ≥ 0, ei ∈ Elt, e0

  • Dorel Lucanu Algoritmica si programare

    LLinOrd

    elimina()intrare:

    L = (e0,…, en-1), e ∈ EltIesire

    L = (…ek-1, ek+1…) daca e = ekeroare in caz contrar

    alKlea()parcurge()

  • Dorel Lucanu Algoritmica si programare

    LLinOrd

    poz() intrare:

    L = (e0,…, en-1), e ∈ Eltiesire:

    pozitia pe care apare e in L sau -1 daca e nu apare in L

  • Dorel Lucanu Algoritmica si programare

    LLinOrd: implementarea cu tablouri

    cautare binarafunction Poz(L, e)begin

    p ← 0; q ← L.ultimm ← [(p+q)/2]while (L.tab[m] != e && p < q) do

    if (e < L.tab[m])then q ← m-1else p ← m+1m ← [(p+q)/2]

    if (L.tab[m] = e)then return melse return -1;

    end

  • Dorel Lucanu Algoritmica si programare

    LLinOrd: implementarea cu tablouri

    cautare binaratimpul de executie O(log n)demonstratie:

  • Dorel Lucanu Algoritmica si programare

    LLinOrd: implementarea cu liste inlantuite

    cautare binara => cautare liniaratimpul de executie O(n) dar mai mic decatin cazul neordonat

  • Dorel Lucanu Algoritmica si programare

    Tipul abstract Stivaobiecte

    liste in care se cunoaste vechimeaelementelor introduse (liste LIFO)

    operatiistivaVida()

    intrare: nimiciesire

    lista vidapush()

    intrareS ∈ Stiva, e ∈ Elt

    iesireS la care s-a adaugat e ca ultimulelement introdus (cel cu vechimeacea mai mica)

  • Dorel Lucanu Algoritmica si programare

    Tipul abstract Stiva (continuare 1)pop()

    intrareS ∈ Stiva

    iesireS din care s-a eliminat ultimul element introdus (cel cu vechimea cea maimica)eroare daca S este vida

    esteVida()intrare

    S ∈ Stivaisesire

    true daca S este vidafalse daca S nu este vida

  • Dorel Lucanu Algoritmica si programare

    Tipul abstract Stiva (continuare 2)top()

    intrareS ∈ Stiva

    iesireultimul element introdus (cel cu vechimea cea mai mica)eroare daca S este vida

  • Dorel Lucanu Algoritmica si programare

    Stiva: implementarea cu liste liniare

    push(S, e) = insereaza(S, 0, e)pop(S) = elimina(S, 0)top(S) = alKlea(S, 0)

    sau

    push(S, e) = insereaza(S, lung(S), e)pop(S) = elimina(S, lung(S)-1)top(S) = alKlea(S, lung(S)-1)

  • Dorel Lucanu Algoritmica si programare

    Stiva: implementarea cu tablouri

    reprezentarea obiectelor

    MAX-1

    en-1S.tab Elt[MAX] e0…

    0

    S.virf n-1

    implementarea operatiilorpush()procedure push(S, e)

    if (S.virf = MAX-1)then throw “eroare”S.virf ← S.virf+1S.tab[virf] ← e

    end

  • Dorel Lucanu Algoritmica si programare

    Stiva: implementarea cu liste inlantuite

    reprezentarea obiectelor

    e0

    en-1

    en-2

    ...

    S

  • Dorel Lucanu Algoritmica si programare

    Stiva: implementarea cu liste inlantuite

    implementarea operatiilorpush()procedure push(S, e)

    new(q)q->elt ← eq->succ ← SS ← q

    endpop()procedure pop(S)

    if (S = NULL) then throw “eroare”q ← SS ← S->succdelete(q)

    end

  • Dorel Lucanu Algoritmica si programare

    Tipul abstract Coadaobiecte

    liste in care se cunoaste vechimeaelementelor introduse (liste FIFO)

    operatiicoadaVida()

    intrare: nimiciesire

    lista vidainsereaza()

    intrareC ∈ Coada, e ∈ Elt

    iesireC la care s-a adaugat e ca ultimulelement introdus (cel cu vechimeacea mai mica)

  • Dorel Lucanu Algoritmica si programare

    Tipul abstract Coada (continuare 1)elimina()

    intrareC ∈ Coada

    iesireC din care s-a eliminat primul element introdus (cel cu vechimea cea maimare) eroare daca C este vida

    esteVida()intrare

    C ∈ Coadaisesire

    true daca C este vidafalse daca C nu este vida

  • Dorel Lucanu Algoritmica si programare

    Tipul abstract Coada (continuare 2)citeste()

    intrareC ∈ Coada

    iesireprimul element introdus (cel cu vechimea cea mai mare)eroare daca C este vida

  • Dorel Lucanu Algoritmica si programare

    Coada: implementarea cu liste liniare

    insereaza(C, e) = LLin.insereaza(C, lung(C), e)elimina(C) = LLin.elimina(C, 0)citeste(C) = LLin.alKlea(C, 0)

  • Dorel Lucanu Algoritmica si programare

    Coada: implementarea cu tablouri

    reprezentarea obiectelor

    C.tab Elt[nMax] …MAX-1

    C.prim p

    … …

    C.ultimq

    e0 en-1

    C.tab Elt[nMax] …MAX-1

    C.ultim q

    … …

    C.primp

    en-1 e0 ei

    C are patru campuri: C.tab, C.prim, C.ultim, C.nrElem

  • Dorel Lucanu Algoritmica si programare

    Coada: implementarea cu tablouri

    implementarea operatiilorinsereaza()procedure insereaza(C, e)

    if (C.nrElem = MAX-1) then throw “error”C.ultim ← (C.ultim + 1) % MAXC.tab[C.ultim] ← eC.nrElem ← C.nrElem + 1

    end

  • Dorel Lucanu Algoritmica si programare

    Coada: implementarea cu liste inlantuite

    reprezentarea obiectelor

    C.prim

    e0 e1 en-1…

    C.ultim

  • Dorel Lucanu Algoritmica si programare

    Coada: implementarea cu liste inlantuite

    implementarea operatiilorinsereaza()procedure insereaza(C, e)

    new(q)q->elt ← eq->succ ← NULL if (C.ultim = NULL)then C.prim ← q

    C.ultim ← qelse C.ultim->succ ← q

    C.ultim ← qend

  • Dorel Lucanu Algoritmica si programare

    Aplicatie: notatia postfixata a expresiilor

    notatia infixataa + ba + (b * 2)notatia postfixataa b +b 2 * a +reguli de precedentaa + b * 2reguli de asociere7 / 3 * 2

    la stanga (7 / 3) * 2la dreapta 7 / (3 * 2)

  • Dorel Lucanu Algoritmica si programare

    Translatarea infix -> postfix

    procedure convInfix2Postfix(infix, postfix)/* infix si postfix sunt cozi */begin

    S ← stivaVida()while (!esteVida(infix)) do

    citeste(infix, x); elimina(infix);if (x este operand) then insereaza(postfix,x)else if (x = ‘)’)then

    while (top(s) ≠ ‘(‘) doinsereaza(postfix, top(S)); pop(S)

    pop(S)else

    while (priorit(top(S)) >= priorit(x)) doinsereaza(postfix, top(S)); pop(S)

    push(S,x)while (!estevida(S)) do

    insereaza(postfix, top(S)); pop(S)end

  • Dorel Lucanu Algoritmica si programare

    Evaluare a expresiilor postfixate

    function valPostfix(postfix)begin

    S ← stivaVida()while (!esteVida(postfix)) do

    citeste(postfix, x); elimina(postfix)if (x este operand)then push(S, x)else drp ← top(S); pop(S)

    stg ← top(S); pop(S)val ← stg op(x) drppush(S, val)

    val = top(S); pop(S)return val

    end