Sunteți pe pagina 1din 40

Curs 6 - agenda

Tipuri de date de nivel nalt


Liste liniare Liste liniare ordonate Stiva Coada

Tipul abstract (LLin, LLinOrd, Stiva, Coada)

Aplicaie la conversii de expresii


Algoritmi i programare

Implementarea cu tablouri Implementarea cu liste simplu nlnuite

obiecte

Liste liniare: tipul abstract LLin

operaii

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


()

intrare: nimic ieire

insereaza()
intrare: ieire

(lista cu zero elemente)

L = (e0,, en-1), k Nat, e Elt L = (ek-1, e, ek,) daca 0 k n eroare n caz contrar 2

Algoritmi i programare

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

ieire
L = (ek-1, ek+1) daca 0 k n-1 eroare n caz contrar

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

ieire
ek daca 0 k n-1 eroare n caz contrar
Algoritmi i programare 3

LLin (continuare 2)
elimTotE()
intrare:
L = (e0,, en-1), e Elt

ieire:
lista L din care s-au eliminat toate elementele egale cu e

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

ieire:
lista L n care toate elementele au fost procesate aplicnd viziteaza()
Algoritmi i programare 4

LLin (continuare 3)
poz()
intrare:
L = (e0,, en-1), e Elt

ieire:
prima poziie pe care apare e n L sau -1 dac e nu apare n L

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

ieire:
n lungimea listei L

Algoritmi i programare 5

LLin: implementare cu tablouri


reprezentarea obiectelor L = (e0,, en-1)
L.tab Elt[MAX] L.ultim
e0

en-1

0 Nat

MAX-1

L este o structur care conine


un cmp de tip tablou L.tab pentru memorarea elementelor un cmp L.ultim pentru memorarea poziiei ultimului element
Algoritmi i programare 6

LLin: implementare cu tablouri: operaii


insereaza()
deplaseaz elementele de pe poziiile k, k+1, la dreapta cu o poziie insereaz e pe poziia k excepii:
k < 0, k > L.ultim+1 (n) L.ultim = MAX-1

Algoritmi i programare

LLin: implementare cu tablouri: operaii


void insereaza(LLin &L, int k, Elt e){
if (k < 0 || k > L.ultim+1){ printf(eroare-pozitie incorecta); return; } if (L.ultim >= MAX-1){ printf(eroare-spatiu insuficient); return; } int j; for (j = L.ultim; j >= k; j--) L.tab[j+1] = L.tab[j]; L.tab[k] = e; L.ultim = L.ultim + 1;

};

timpul de execuie: O(n)


Algoritmi i programare 8

LLin: implementare cu tablouri: operaii


parcurge()
void parcurge(LLin L, void viziteaza(Elt)){ int i = 0; for(; i <= L.ultim; i++) viziteaza(L.tab[i]); }

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

Algoritmi i programare

LLin: implementare cu liste nlnuite


reprezentarea obiectelor L = (e0,, en-1)
L.prim L.ultim

e0

e1

en-1

L structur cu dou cmpuri


L.prim - pointer la primul element L.ultim - 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
Algoritmi i programare 10

LLin: implementare cu liste nlnuite


insereaza()
parcurge elementele 0, 1,, k-1 insereaz un nou element dup k-1
creeaz nodul memoreaz informaiile reface legturile

excepii

lista vid k = 0 k = n k < 0, k > n


11

Algoritmi i programare

LLin: implementare cu liste nlnuite


ek-1
e L.prim L.ultim

ek

e L.prim e
Algoritmi i programare

e0
12

LLin: implementare cu liste nlnuite


void insereaza(LLin &L, int k, Elt e)}{ if (k < 0) { printf(eroare-pozitie incorecta); return;} Nod* q = new Nod; q->elt = e; if (k == 0 || L.prim == NULL){ q->succ = L.prim; L.prim = q; if (L.ultim == NULL) L.ultim = q; } else { Nod * p = L.prim; int j = 0; while (j < k-1 && p != L.ultim ){ p = p->succ; j++; } if (j < k-1) { printf(eroare-poz. incorecta); return;} q->succ = p->succ; p->succ = q; if (p == L.ultim) L.ultim = q; } }
13

Algoritmi i programare

LLin: aplicaie
linie poligonal de puncte
Punct: structur cu dou cmpuri x i y crearea unei liste void creeazaLista(LLin &L) L = listaVida(); /* citeste n */ for (int i = 0; i < n-1; i++){ /* citeste p.x, p.y */ insereaza(L, 0, p); } atenie: timpul de execuie depinde de implementare
Algoritmi i programare 14

LLin: aplicaie (continuare 1)


multiplic cu 2 coordonatele unui punct void ori2Punct(Punct &p){ p.x *= 2; p.y *= 2; } multiplic cu 2 coordonatele unei linii poligonale void ori2Linie(L){ parcurge(L, ori2Punct); }
Algoritmi i programare 15

LLin: aplicaie (continuare 2)


translateaz punct void trPunct(Punct &p, int dx, int dy){ p.x = p.x + dx; p.y = p.y + dy; } translateaz linie poligonal void trLinie(LLin L, int dx, int dy){ parcurge(L, trPunct, dx, dy); }
- totui presupune modificare procedurii parcurge
Algoritmi i programare 16

Liste liniare ordonate: LLinOrd


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

operaii
listaVida()
intrare: nimic ieire
() (lista cu zero elemente)

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

ieire
L = (ek-1, e, ek,) daca ek-1 e ek (e-1= - , en = + ) Algoritmi i programare 17

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

ieire
L = (ek-1, ek+1) daca e = ek eroare n caz contrar

alKlea() parcurge() poz()

Algoritmi i programare

18

LLinOrd: implementare cu tablouri


cutare binar
int Poz(LLinOrd L, Elt e){ int p = 0, q = L.ultim; int m = (p+q)/2; while (L.tab[m] != e && p < q){ if (e < L.tab[m]) q = m1; else p = m+1; m = (p+q)/2; } if (L.tab[m] == e) return m; else return -1; }
Algoritmi i programare 19

LLinOrd: complexitatea cutrii


implementare cu tablouri
timpul de execuie O(log n)

implementare cu liste nlnuite


cutarea binar -> cutare liniar timpul de execuie O(n), dar mai mic dect n cazul neordonat

Algoritmi i programare

20

Tipul abstract Stiva


obiecte
liste n care se cunoate vechimea elementelor introduse (liste LIFO) stivaVida()

operaii

intrare: nimic ieire


lista vid

push()

intrare ieire
S

Stiva, e Elt

S la care s-a adaugat e ca ultimul element introdus (cel cu vechimea cea mai mic)
21

Algoritmi i programare

Stiva (continuare 1)
pop()
intrare
S

Stiva

ieire
S din care s-a eliminat ultimul element introdus (cel cu vechimea cea mai mic) eroare dac S este vid

esteVida()
intrare
S

Stiva

ieire
true dac S este vid false dac S nu este vid
Algoritmi i programare 22

Stiva (continuare 2)
top()
intrare
S

Stiva

ieire
ultimul element introdus (cel cu vechimea cea mai mic) eroare dac S este vid

Algoritmi i programare

23

Stiva (continuare 3)
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)
Algoritmi i programare 24

Stiva: implementare cu tablouri


reprezentarea obiectelor
S.tab Elt[MAX] e0 0 S.varf n-1 en-1 MAX-1

implementarea operaiilor
push()
void push(Stiva &S, Elt e){
if (S.virf == MAX-1) { printf(eroare); return; } S.virf = S.virf+1; S.tab[virf] = e;

}
Algoritmi i programare 25

Stiva: implementare cu liste nlnuite


reprezentarea obiectelor
S en-1 en-2
. . .

e0
Algoritmi i programare 26

Stiva: implementare cu liste nlnuite


implementarea operaiilor
push()
void push(Nod* S, Elt e){
Nod* q = new Nod; q->elt = e; q->succ = S; S = q;

pop()
void pop(Nod* S){
if (S == NULL) { printf(eroare); return; } q = S; S = S->succ; delete q;

Algoritmi i programare

27

Tipul abstract Coada


obiecte
liste n care se cunoate vechimea elementelor introduse (liste FIFO) coadaVida()
lista vid

operaii

intrare: nimic ieire intrare C Coada, e Elt ieire

insereaza()

C la care s-a adugat e ca ultimul element introdus (cel cu vechimea cea mai mic)
28

Algoritmi i programare

Coada (continuare 1)
elimina()
intrare
C

Coada

ieire
C din care s-a eliminat primul element introdus (cel cu vechimea cea mai mare) eroare dac C este vid

esteVida()
intrare
C

Coada

ieire
true dac C este vid false dac C nu este vid
Algoritmi i programare 29

Coada (continuare 2)
citeste()
intrare
C

Coada

ieire
primul element introdus (cel cu vechimea cea mai mare) eroare dac C este vid

Algoritmi i programare

30

Coada (continuare 3)
insereaza(C, e) = insereaza(C, lung(C), e) elimina(C) = elimina(C, 0) citeste(C) = alKlea(C, 0)

Algoritmi i programare

31

Coada: implementare cu tablouri


reprezentarea obiectelor
C Elt[nMax] prim e0 en-1 nMax-1 p ultim q

Elt[nMax]

ultim

en-1 q

e0 ei nMax-1 prim p
32

Algoritmi i programare

Coada: implementare cu tablouri


implementarea operaiilor
insereaza()
void insereaza(Coada &C, Elt e){ if ((C.ultim + 1) % nMax == C.prim){ printf(error); return; } C.ultim = (C.ultim + 1) % nMax; C.elemente[ultim] = e; }
Algoritmi i programare 33

Coada: implementare cu liste nlnuite


reprezentarea obiectelor

prim e0 e1

ultim en-1

Algoritmi i programare

34

Coada: implementare cu liste nlnuite


implementarea operaiilor
insereaza()
void insereaza(Coada &C, Elt e){ Nod* q = new Nod; q->elt = e; q->succ = NULL; if (C.ultim == NULL){ C.prim = q; C.ultim = q; } else { C.ultim->succ = q; C.ultim = q; } }
Algoritmi i programare 35

Aplicaie: notaia postfixat a expresiilor


notaia infixat
a+b a + (b * 2)

notaia postfixat
a b+ ab2*+

reguli de preceden
a+b*2

reguli de asociere
7/3*2 la stnga (7 / 3) * 2 la dreapta 7 / (3 * 2)
Algoritmi i programare 36

Translatarea infix -> postfix


void convInfix2Postfix(Coada &infix, Coada &postfix) { /* infix si postfix sunt cozi */ Stiva S = stivaVida(); while (!esteVida(infix)) { citeste(infix, x); elimina(infix); if (esteOperand(x)) insereaza(postfix, x) else if (x == )) { while (top(s)!=() {insereaza(postfix, top(S)); pop(S)} pop(S); } else { while( !estevida(S) && top(S) != ( && \ priorit(top(S))>= priorit(x)) { insereaza(postfix, top(S)); pop(S); } push(S,x); } } while (not estevida(S)) {insereaza(postfix, top(S)); pop(S);} }

Algoritmi i programare

37

Translatarea infix -> postfix


Exemplu: a+b*(c+d)+e

x a + b * (

x c + d ) + e

inf.tab postf.tab

Elt[MAX] Elt[MAX]
S (stiva) + ( * +

a b c d + * + e +

Algoritmi i programare

38

Evaluarea expresiilor postfixate


int valPostfix(Coada postfix){ Stiva S = stivaVida(); char x; while (!esteVida(postfix)){ citeste(postfix, x); elimina(postfix); if (esteOperand(x))push(S, x); else { char drp = top(S); pop(S); char stg = top(S); pop(S); int val = op(stg, x, drp); push(S, val); } } val = top(S); pop(S); return val; }
Algoritmi i programare 39

Translatarea infix -> postfix


Exemplu: abcd+*+e+

postf.tab

Elt[MAX]
S (stiva)

a b c d + * + e +

d c+d c b*(c+d) e b a a+b*(c+d)+e a+b*(c+d)

Algoritmi i programare

40

S-ar putea să vă placă și