sd_curs-04
DESCRIPTION
structuri de date informaticaTRANSCRIPT
-
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