sd_curs-04

51
Curs 4 – conținut • Tipuri de date de nivel înalt – Liste liniare – Liste liniare ordonate – Stiva Coada Algoritmi şi programare 1 • Tipul abstract (LLin, LLinOrd, Stiva, Coada) – Implementarea cu tablouri – Implementarea cu liste simplu înlănţuite • Aplicaţie la conversii de expresii

Upload: smiley-andrei

Post on 04-Oct-2015

213 views

Category:

Documents


0 download

DESCRIPTION

structuri de date informatica

TRANSCRIPT

  • Curs 4 coninut

    Tipuri de date de nivel naltListe liniareListe liniare ordonateStivaCoada

    Algoritmi i programare 1

    Coada

    Tipul abstract (LLin, LLinOrd, Stiva, Coada) Implementarea cu tablouri Implementarea cu liste simplu nlnuite

    Aplicaie la conversii de expresii

  • Liste liniare - exemple

    Studeni

    (Adriana, George, Luiza, Maria, Daniel)

    Examene

    (Mate, Logica, SD, ACSO, ENG) (Mate, Logica, SD, ACSO, ENG)

    Zile sptmnii

    (L, M, Mi, J, V, S, D)

    Lunile anului

    (Ian, Feb, Mar, Apr, ..., Dec)

    Algoritmi i programare 2

  • Tipul de date abstract LLin

    Obiecte: L = (e0,, en-1), n 0

    ei Elt (tipul abstract al elementelor)

    Relaii:

    Algoritmi si programare 3

    Relaii: e0 primul element al listei

    en-1 ultimul element al listei

    ei elementul predecesor lui ei+1

  • LLin operaii

    listaVida() intrare: nimic

    iesire: L = () (lista cu zero elemente)

    insereaza()

    Algoritmi si programare 4

    insereaza()intrare:

    L = (e0,, en-1), k Nat, e Elt

    iesire

    L = (ek-1, e, ek,) daca 0 k n

    eroare in caz contrar

  • LLin insereaza()- exemple

    L = (a, b, c, d, e, f, g)

    insereaza(L, 0, x) =>

    L = (x, a, b, c, d, e, f, g)

    (Obs.: Indexul elementelor a,...,g crete cu 1.)

    Algoritmi si programare 5

    insereaza(L, 2, x) => L = (a, b, x, c, d, e, f, g)

    insereaza(L, 0, x) => L = (x, a, b, c, d, e, f, g)

    insereaza(L, 10, x) => eroare

    insereaza(L, -7, x) => eroare

  • LLin - operaii

    elimina()

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

    iesire

    Algoritmi si programare 6

    iesire L = (ek-1, ek+1) daca 0 k n-1

    eroare in caz contrar

  • LLin elimina()- exemple

    L = (a, b, c, d, e, f, g)

    elimina(L, 2) =>

    L = (a, b, d, e, f, g)

    (Obs.: Indexul elementelor d,...,g descrete cu 1.)

    Algoritmi si programare 7

    elimina(L, 10) => eroare

    elimina(L, -7) => eroare

  • LLin - operaii

    alKlea()

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

    Algoritmi si programare 8

    L = (e0,, en-1), k Nat

    iesire ek daca 0 k n-1

    eroare in caz contrar

  • LLin alKlea()- exemple

    L = (a, b, c, d, e, f, g)

    alKlea(L, 0) => a

    alKlea(L, 2) => c

    Algoritmi si programare 9

    alKlea(L, 6) => g

    alKlea(L, 20) => eroare

    alKlea(L, -2) => eroare

  • LLin - operaii

    elimTotE()

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

    Algoritmi si programare 10

    iesire: lista L din care s-au eliminat toate

    elementele egale cu e

  • LLin elimTotE()- exemple

    L = (a, b, c, a, b, c, a)

    elimTotE(L, a) => (b, c, b, c)

    Algoritmi si programare 11

    elimTotE(L, c) => (a, b, a, b, a)

    elimTotE(L, d) => (a, b, c, a, b, c, a)

  • LLin - operaii

    parcurge()

    intrare: L = (e0,, en-1), o procedur (funcie) viziteaza()

    Algoritmi si programare 12

    0 n-1

    viziteaza()

    ieire: lista L n care toate elementele au fost

    procesate aplicnd viziteaza()

  • LLin parcurge()- exemple

    L = (1, 2, 3, 1, 2, 3)

    parcurge(L, oriDoi() ) => (2, 4, 6, 2, 4, 6)

    Algoritmi si programare 13

    parcurge(L, incrementeaza()) => (2, 3, 4, 2, 3, 4)

  • LLin - operaii

    poz()

    intrare:

    Algoritmi si programare 14

    L = (e0,, en-1), e Elt

    iesire: prima pozitie pe care apare e in L

    sau -1 daca e nu apare in L

  • LLin poz()- exemple

    L = (a, b, c, a, b, c, d)

    poz(L, a) => 0

    Algoritmi si programare 15

    poz(L, c) => 2

    poz(L, d) => 6

    poz(L, e) => -1

  • LLin - operaii

    lung()

    intrare: L = (e0,, en-1)

    iesire: n lungimea listei L

    Algoritmi si programare 16

    n lungimea listei L

    Exemplu:

    L = (a, b, c, a, b, c, d)

    lung(L) => 7

  • LLin: implementare cu tablouri

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

    MAX-1

    en-1L.tab Elt[MAX] e0

    0

    L.ultim Nat

    Algoritmi si programare 17

    L este o structur

    un cmp de tip tablou L.tab pentru memorarea elementelor

    un cmp L.ultim pentru memorarea poziiei ultimului element

  • Llin (implementare cu tablouri): operaii

    insereaza()

    deplaseaz elementele de pe poziiile k, k+1, la dreapta cu o poziie

    Algoritmi si programare 18

    insereaz e pe poziia k

    excepii: k L.ultim+1 (n)

    L.ultim = MAX-1

  • LLin (implementare cu tablouri): operaii

    procedure insereaza(L, k, e)

    begin

    if (k < 0 or k > L.ultim+1)

    then throw eroare-pozitie incorecta

    if (L.ultim >= MAX-1)

    then throw eroare-spatiu insuficient

    Algoritmi si programare 19

    then throw eroare-spatiu insuficient

    for j L.ultim downto k do

    L.tab[j+1] L.tab[j]

    L.tab[k] e

    L.ultim L.ultim + 1

    end

    timpul de executie: O(n)

  • LLin: implementare cu tablouri: operaii

    parcurge()procedure parcurge(L, viziteaza())

    begin

    for i 0 to L.ultim do

    viziteaza(L.tab[i])

    Algoritmi si programare 20

    viziteaza(L.tab[i])

    end

    dac viziteaza() proceseaz un element n O(1), atunci parcurge() proceseaz lista n O(n) (n este numrul elementelor listei)

  • L structur cu dou cmpuri

    LLin: implementarea cu liste nlnuite

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

    L.prim

    e0 e1 en-1

    L.ultim

    Algoritmi si programare 21

    L structur cu dou cmpuri

    pointer la primul element

    pointer la ultimul element

    un nod *p (aflat la adresa din p) are dou cmpuri:

    unul pentru memorarea informaiei: p->elt = ei unul pentru nodul succesor: p->succ

  • LLin: implementarea cu liste nlnuite

    insereaza()parcurge elementele 0, 1,, k-1 insereaz un nou element dup k-1

    creeaz nodul memoreaz informaii reface legturi

    Algoritmi si programare 22

    reface legturi

    excepii lista vida k=0 k=n k n

  • LLin: implementarea cu liste nlnuite

    ek-1

    e

    L.prim L.ultim

    ek

    Algoritmi si programare 23

    e

    e e0

    L.prim

  • LLin : implementarea cu listenlnuite

    procedure insereaza(L, k, e)begin

    if (kelt eif (k = 0 or L.prim = NULL)then q->succ L.prim

    L.prim q

    Algoritmi si programare 24

    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 eroare-pozitieincorecta

    q->succ p->succ; p->succ q if (p = L.ultim) then L.ultim q

    end

  • LLin: aplicaie

    linie poligonal de puncte Punct: structur cu dou cmpuri x si y

    crearea unei listeprocedure creeazaLista(L)

    begin

    L listaVida();

    Algoritmi si programare 25

    L listaVida();

    /* citeste n */

    for i 0 to n-1 do

    /* citeste p.x, p.y */

    insereaza(L, 0, p)

    end

    atenie: timpul de execuie depinde de implementare

  • LLin: aplicaie

    multiplic cu 2 coordonatele unui punct

    procedure ori2Punct(p)

    begin

    p.x p.x * 2

    p.y p.y * 2

    end

    Algoritmi si programare 26

    end

    multiplic cu 2 coordonatele unei linii poligonale

    procedure ori2Linie(L)

    begin

    parcurge(L, ori2Punct())

    end

  • LLin: aplicaie

    translateaz punct

    procedure trPunct(p, dx, dy)

    begin

    p.x p.x + dx

    p.y p.y + dy

    end

    Algoritmi si programare 27

    end

    translateaz linie poligonal

    procedure trLinie(L, dx, dy)

    begin

    parcurge(L, trPunct())

    end

  • Liste liniare ordonate: LLinOrd

    obiecte L = (e0,, en-1), n 0, ei Elt, e0

  • Liste liniare ordonate: LLinOrd

    elimina() intrare:

    L = (e0,, en-1), e Elt

    Iesire L = (ek-1, ek+1) daca e = ek eroare in caz contrar

    Algoritmi si programare 29

    eroare in caz contrar

    alKlea()

    parcurge()

    poz()

  • LLinOrd: Implementare cu tablouri cutare binarfunction Poz(L, e)

    begin

    p 0; q L.ultim

    m [(p+q)/2]

    while(L.tab[m] != e && p < q) do

    if (e < L.tab[m])

    Algoritmi si programare 30

    if (e < L.tab[m])

    then q m 1

    else p m + 1

    m [(p+q)/2]

    if (L.tab[m] = e)

    then return m

    else return -1;

    end

  • LLinOrd: Complexitatea cutrii

    implementare cu tablouri timpul de execuie O(logn)

    Algoritmi si programare 31

    implementarea cu liste nlnuite timpul de execuie O(n) (cutare liniar)

  • Tipul abstract Stiva

    obiecte liste n care se cunoate vechimea

    elementelor introduse (liste LIFO) operaii

    stivaVida() intrare: nimic

    Algoritmi si programare 32

    intrare: nimic iesire

    S=(), lista vida

    push() intrare

    S Stiva, e Elt

    iesire S la care s-a adaugat e ca ultimul element

    introdus (cel cu vechimea cea mai mic)

  • Tipul abstract Stiva

    pop() intrare

    S Stiva

    iesire S din care s-a eliminat ultimul element introdus

    (cel cu vechimea cea mai mic)

    eroare dac S este vid

    Algoritmi si programare 33

    eroare dac S este vid

    esteVida() intrare

    S Stiva

    iesire true dac S este vid

    false dac S nu este vid

  • Tipul abstract Stiva

    top() intrare

    S Stiva

    iesire ultimul element introdus (cel cu vechimea cea

    Algoritmi si programare 34

    ultimul element introdus (cel cu vechimea cea mai mic)

    eroare dac S este vid

  • Stiva: implementarea cu liste liniare

    push(S, e) = insereaza(S, 0, e)

    pop(S) = elimina(S, 0)

    top(S) = alKlea(S, 0)

    sau

    Algoritmi si programare 35

    sau

    push(S, e) = insereaza(S, lung(S), e)

    pop(S) = elimina(S, lung(S)-1)

    top(S) = alKlea(S, lung(S)-1)

  • Stiva: implementarea cu tablouri reprezentarea obiectelor

    MAX-1

    en-1S.tab Elt[MAX] e0

    0

    S.virf n-1

    implementarea operaiilor

    Algoritmi si programare 36

    implementarea operaiilor push()

    procedure push(S, e)

    begin

    if (S.virf = MAX-1)

    then throw eroare

    S.virf S.virf+1

    S.tab[virf] e

    end

  • Stiva: implementarea cu liste nlnuite

    reprezentarea obiectelor

    en-1

    e

    S

    Algoritmi si programare 37

    e0

    en-2

    .

    .

    .

  • Stiva: implementarea cu liste nlnuite

    implementarea operaiilor push()

    procedure push(S, e)

    beginnew(q)

    q->elt e

    q->succ S

    Algoritmi si programare 38

    q->succ S

    S q

    end

    pop()procedure pop(S)

    beginif (S = NULL) then throw eroare

    q S

    S S->succ

    delete(q)

    end

  • Tipul abstract Coada

    obiecte liste n care se cunoate vechimea

    elementelor introduse (liste FIFO) operaii

    coadaVida() intrare: nimic iesire

    Algoritmi si programare 39

    intrare: nimic iesire

    lista vid

    insereaza() intrare

    C Coada, e Elt

    iesire C la care s-a adugat e ca ultimul element

    introdus (cel cu vechimea cea mai mic)

  • Tipul abstract Coada

    elimina() intrare

    C Coada

    iesire C din care s-a eliminat primul element introdus

    (cel cu vechimea cea mai mare)

    eroare dac C este vid

    Algoritmi si programare 40

    eroare dac C este vid

    esteVida() intrare

    C Coada

    isesire true dac C este vid

    false dac C nu este vid

  • Tipul abstract Coada

    citeste() intrare

    C Coada

    iesire primul element introdus (cel cu vechimea cea mai

    Algoritmi si programare 41

    primul element introdus (cel cu vechimea cea mai mare)

    eroare dac C este vid

  • 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)

    Algoritmi si programare 42

    citeste(C) = LLin.alKlea(C, 0)

  • p

    Coada: implementarea cu tablouri

    reprezentarea obiectelor

    C Elt[nMax]

    nMax-1

    prim

    ultimq

    e0

    en-1

    Algoritmi si programare 43

    pprim ultimq

    C Elt[nMax]

    nMax-1

    ultim q

    primp

    en-1

    e0

    ei

  • Coada: implementarea cu tablouri

    implementarea operaiilor insereaza()

    procedure insereaza(C, e)

    beginif ((ultim + 1) % nMax = prim)

    Algoritmi si programare 44

    if ((ultim + 1) % nMax = prim)

    then throw error

    ultim (ultim + 1) % nMax

    C[ultim] e

    end

  • Coada: implementarea cu liste nlnuite

    reprezentarea obiectelor

    prim

    Algoritmi si programare 45

    e0 e1 en-1

    prim ultim

  • Coada: implementarea cu liste nlnuite

    implementarea operaiilor insereaza()

    procedure insereaza(C, e)

    beginnew(q)

    q->elt e

    Algoritmi si programare 46

    q->elt e

    q->succ NULL

    if (ultim = NULL)

    then prim q

    ultim q

    else ultim->succ q

    ultim q

    end

  • Aplicatie: notatia postfixata a expresiilor

    notatia infixataa + b

    a + (b * 2)

    notatia postfixataa b +

    a b 2 * +

    Algoritmi si programare 47

    a b 2 * +

    reguli de precedentaa + b * 2

    reguli de asociere7 / 3 * 2

    la stanga (7 / 3) * 2

    la dreapta 7 / (3 * 2)

  • Translatarea infix -> postfixprocedure convInfix2Postfix(infix, postfix)

    /* infix si postfix sunt cozi */

    begin

    S stivaVida()

    while (not esteVida(infix)) do

    citeste(infix, x); elimina(infix);

    if (x este operand) then insereaza(postfix,x)

    else if (x = ))then

    while (top(s) () do

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

    Algoritmi si programare 48

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

    pop(S)

    else

    while (not estevida(S) and top(S)( and priorit(top(S))>=priorit(x)) do

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

    push(S,x)

    while (not estevida(S)) do

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

    end

  • Translatarea infix -> postfixExemplu: a+b*(c+d)+e

    (inf.tab Elt[MAX] a *b+ c d+ ) + e

    +postf.tab Elt[MAX] a dcb * e+ +

    x x

    Algoritmi si programare 49

    (

    S (stiva)

    +

    *

    +

    +

  • Evaluarea 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)

    Algoritmi si programare 50

    else drp top(S); pop(S)

    stg top(S); pop(S)

    val stg op(x) drp

    push(S, val)

    val = top(S); pop(S)

    return val

    end

  • c d

    Translatarea infix -> postfixExemplu: abcd+*+e+

    +postf.tab Elt[MAX] a b * e+ +

    S (stiva)

    x x

    Algoritmi si programare 51

    a

    b

    c

    d

    c+d

    b*(c+d)

    a+b*(c+d)

    e

    a+b*(c+d)+e