Documente Academic
Documente Profesional
Documente Cultură
Structuri liniare
Liste. Stive. Cozi
- Inserare, cautare, stergere -
Cuprins
2
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
3
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
4
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Structuri liniare - Liste
Operatii de baza
5
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
6
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Liste liniare alocate secvential
Exemple
3 -12 10 7 1
- lista de numere intregi
0 1 2 3 4
0.3 -1.2 10 5.7 8.7 0.2 -1.5 1
- lista de numere reale
C / C++ Pascal
Declarare
int a[20]; var a : array [1..20] of integer;
double b[30]; var b : array [1..30] of double;
char c[23]; var c : array [1..23] of char;
7
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Liste liniare alocate secvential
C / C++ Pascal
8
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Liste liniare alocate secvential
Numarul de comparatii: n + 1 + 1
9
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Liste liniare alocate secvential
10
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Liste liniare alocate secvential
Complexitate
Consideram cazul cel mai defavorabil (cautare fara succes)
2C(n) > n > 2C(n)-1 => C(n) < log2n +1=> C(n) = O(log2n)
11
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Liste liniare alocate secvential
C / C++ Pascal
12
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Liste liniare alocate secvential
• LIFO (Last In First Out): ultimul element introdus este primul extras
13
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Liste liniare alocate secvential
4! = 4*3! = 4 * 6 = 24
1, dacă n=0 3! = 3*2! =3*2=6
n! = 2! = 2*1! =2*1=2
1! = 1*0! =1*1=1 Adâncimea
n*(n-1)!, dacă n>=1 0! = 1 recursivității
C / C++ Pascal
long factorial(int n) function factorial(n: integer): longint
{ begin
if (n==0) return 1; //conditia de oprire if (n=0) then
return n*factorial(n-1); //recursivitate fact := 1 {conditia de oprire}
} else
fact := n*factorial(n-1)
{recursivitate} 14
end;
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Liste liniare alocate secvential
Stack
1 2 Top Max
16
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Stiva in alocare statica
Implementare stiva locaţii libere
Stack
1 2 Top Max
Inserare Pascal
C / C++Fig.2.2.1. Stiva Stack cu alocare secvenţială.
17
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Stiva in alocare statica
Implementare stiva locaţii libere
Stack
1 2 Top Max
C / C++
Fig.2.2.1. Stiva Stergere Pascal
Stack cu alocare secvenţială.
18
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Liste liniare alocate secvential
19
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
PUSH 2 2
PUSH 4 2 4
2 4 6
PUSH 6 2 4 6
POP 4 6 Afis: 2
3 5
POP 6 Afis: 4
PUSH 3 6 3
BF: 1, 2, 4, 6, 3, 5.
PUSH 5 6 3 5
POP 3 5 Afis: 6
POP 5 Afis: 3
Coada vida
POP Afis: 5
20
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Coada in alocare statica
Implementare
C / C++ Pascal
Declarare
21
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Coada in alocare statica
Implementare
Inserare Pascal
C / C++
procedure Push (Val : integer);
void Push (int Val)
begin
{
if (Rear = MAX) then
if (Rear == MAX-1)
// Overflow
// Overflow
else
else
begin
{if (Rear == -1)
if (Rear = 0) then
//coada initial vida
// coada initial vida
Front++;
Front := Front + 1;
Rear++;
Rear := Rear + 1;
Queue[Rear] = Val;}
Queue[Rear] := Val;
}
end;
end;
22
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Coada in alocare statica
Implementare
Stergere Pascal
C / C++
.
. .
. . .
Front
. . .
Front
Fron
.
.
.
Rear
t
24
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Liste liniare alocate secvential
n = 12
m=3 1 2 3 4 1 2 3 4 1 3 4 1 4
k = 2; 12 5 12 5 12
11 6 11 6 6 6
10 9 8 7 10 9 8 7 10 9 7 10 9
Afis: 2, 5, 8, 11 Afis: 3, 7, 12 Afis: 6, 1
1 4 1 4
Ordine: 2,5,8,11,3,7,12,6,1,10,4,9
6 6
10 9 10 9
25
Afis: 10, 4 Afis: 9
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Liste liniare alocate secvential
26
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Liste liniare alocate secvential
27
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Liste liniare inlantuite
Dezavantaje:
28
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Liste liniare inlantuite alocate static
30
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
nou = 8 a 10 11 22 40 65 38 77 100
a[8].inf = 100 3 7 5 8 2 1 4 0
a[8].urm = 0
ultim = 8 oc 1 1 1 1 1 1 1 1 0 0
1 2 3 4 5 6 7 8 9 10
31
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
p=3 a 10 11 22 40 65 38 77 100
nou = 8
3 7 8 0 2 1 4 5
a[8].inf = 100
a[8].urm = 5 oc 1 1 1 1 1 1 1 1 0 0
a[3].urm = 8
33
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
34
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
35
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Exemplu val = 22
Precedentul valorii
22 = pozitia p a 10 11 22 40 65 38 77
p=1 5 7 5 0 2 1 4
aux = 3
a[8].inf = 100 oc 1 1 0 1 1 1 1 0 0 0
a[8].urm = 2
a[2].urm = 8
aux 3
37
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
38
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
urm ultim
prim
- prim retine adresa primului nod din lista, iar ultim retine adresa
sfarsitului listei;
- fiecare nod conţine:
39
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
40
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Cautare
p = prim; p := prim;
while (p != NULL && x != p→info) while (p <> nil) and (x <> p^.info) do
p = p → urm; p := p^.urm;
41
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
new (aux);
nod* aux = new nod;
// prelucrare aux^.info;
// prelucrare aux->info
if (prim <> nil) then
if (prim != NULL)
aux^.urm := prim
aux->urm = prim;
else
else aux^.urm := nil;
aux->urm = NULL; prim := aux;
prim = aux;
42
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
p p->urm
aux
new (aux);
aux = new nod;
{ prelucrare aux^.info;}
// prelucrare aux → info;
aux → urm = p → urm;
aux^.urm := p^.urm;
p → urm = aux;
p^.urm := aux;
43
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
locaţie eliberată
prim
Start
... ...
noua legătură
Eventual dezalocare de spatiu pentru nodul extras (sau alte operatii cu el)
45
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
temp : pnod;
if (prim != NULL)
{ if (prim <> nil) then
nod *temp = prim; begin
prim = prim → urm; temp := prim;
delete temp; prim := prim ^.urm;
} dispose (temp);
end
46
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
temp
noua legătură
47
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
prev next
• cu nod marcaj
• circulare
• dublu inlantuite Fig.2.1.6. Nod într-o listă dublu înlănţuită.
Start
...
48
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Stiva in alocare dinamica
C / C++ Pascal
...
↑ Top
struct nodFig.2.2.2.
{ Stiva Top cu alocare înlănţuită.
int info; type pnod = ^nod;
nod *urm; nod = record
}; inf :integer;
urm :pnod;
nod * Top = NULL; end;
49
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Stiva in alocare dinamica
Exemplificare operatiilor C++
50
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Coada in alocare dinamica
...
↑ Front ↑ Rear
Inserari – Rear
Stergeri - Front
51
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Coada in alocare dinamica
Exemplificare operatiilor C++
Se dau structurile: o stiva S si doua cozi C1 si C2, ce contin caractere. Cele trei
structuri se considera de capacitate infinita, si initial vide. Se considera urmatoarele
operatii:
53
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Stive si cozi
2. Parantezarea corecta
Dat un sir s = s1s2 ... sn de caractere '(' si ')' sa se verifice daca acest sir
este quasi - corect parantezat (i.e., pentru orice subsir s1s2 ... si avem ca
numarul de caractere '(' este mai mare sau egal cu numarul de caractere
')').
54
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Stive si cozi
2. Parantezarea corecta
Pascal
C / C++ var ok:boolean; ok:=true;
bool ok=true; for i:=0 to length(s) do
for(int i=0; i<strlen(s); i++) begin
{if(empty(Stack)) // Stiva e vida if(empty(Stack)=true) then
{ if(s[i]==')') // Stiva vida
{ ok=false; break;} begin
if (s[i] = ')' ) then
push(s[i],Stack);}
begin
else ok=false; break;
if(s[i] == peek(Stack)) end;
push(s[i],Stack); push(s[i],Stack);
else end
pop(Stack); else
} if(s[i] = peek(Stack)) then
if(ok) cout<<"Corect"; push(s[i],Stack);
else cout<<"Incorect”; else
pop(Stack);
end;
55
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Stive si cozi
3. Conectarea pinilor
Se da o suprafata circulara cu un numar n de pini pe margini
(numerotati de la 1 la n), impreuna cu o lista de perechi de pini ce trebuie
conectati cu fire metalice.
Problema cere sa determinati in timp O(n) daca pentru o configuratie
ca mai sus, pinii pereche pot fi conectati, fara ca acestea sa se
intersecteze.
Pereche = {1,2,2,1,5,5,7,7} Pereche = {1,2,2,4,1,6,4,6}
57
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Stive si cozi
4. Evaluarea unei expresii în notatie postfixata
Exemplu (1 + 2 * 3) - (4 - 3 * 2)
in notatie postfixata: 1 2 3 * + 4 3 2 * - -
-
Parcurgerea in preordine:
+ - - + 1 * 2 3 - 4 * 3 2
Parcurgerea in inordine:
1 4 1 + 2 * 3 - 4 - 3 * 2
* *
Parcurgerea in postordine:
1 2 3 * + 4 3 2 * - -
2 3 3 2
58
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Stive si cozi 4. Evaluarea unei expresii în notatie postfixata
Algoritm
Exemplu (1 + 2 * 3) - (4 - 3 * 2)
in notatie postfixata:
1 2 3 * + 4 3 2 * - -
2 2
3 3 3 3 3 6 6
2 2 2 6 6 4 4 4 4 4 4 4 -2 -2
1 1 1 1 1 1 7 7 7 7 7 7 7 7 7 7 9
60
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Stive si cozi
4. Evaluarea unei expresii în notatie postfixata
Detalii de implementare (C++)
Pas 2. – parcurgerea sirului caracter cu caracter si verificarea acestuia (spatiu/ operator/ operand)
61
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Stive si cozi
4. Evaluarea unei expresii în notatie postfixata
Detalii de implementare (C++)
Pas 3. – caracterul este operator (+,-,*,/,%)
62
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Stive si cozi
4. Evaluarea unei expresii în notatie postfixata
Detalii de implementare (C++)
Pas 4. – caracterul este cifra
63
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Stive si cozi
5. Parcurgerea unui arbore pe nivele (BF)
C / C++ Pascal
Front = 1;Rear = 1; // Q[ ] - coada Front := 1; Rear := 1;
// a – matricea de adiacenta read(nod); // de inceput
cin>>nod; // de inceput Q[Front] := nod;
Q[Front]=nod; viz[nod] := 1;
viz[nod]=1; while (Front <= Rear) do
while(Front <= Rear) begin
{ write(Q[Front],’ ‘);
cout<<Q[Front]; for i := 1 to n do
for(i=1;i<=n;i++) if (a[Q[Front]][i]=1) and (viz[i]!=1) then
if( a[Q[Front]][i]==1 && viz[i]!=1 ) begin
{ Rear++; Rear := Rear + 1;
Q[Rear] = i; Q[Rear] := i;
viz[i] = 1; } viz[i] := 1;
Front++; end;
} Front := Front + 1;
end;
64
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Stive si cozi
6. Sirul lui Hamming
65
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Stive si cozi
Implementare 6. Sirul lui Hamming
Semnificatia variabilelor utilizate
c2 - coada ce contine elementul 2*x, unde x este membru al sirului lui Hamming;
f2 si r2 - indecsii primului, respectiv ultimului element din c2;
m2 - valoarea primului element din coada c2;
Pas repetitiv:
- se alege minimul m dintre capetele celor 3 cozi;
- se pune acest minim in vectorul care retine stocheaza sirul lui Hamming;
- se vor insera în cele 3 cozi numerele m x 2, m x 3, m x 5;
- se avanseaza in coada (cozile) din care a provenit minimul.
67
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Stive si cozi
6. Sirul lui Hamming
cin>>M;
m = 1 ;p=1; h[p]=m ;
r2=r3=r5=0;
c2[++r2]=m*2;
c3[++r3]=m*3;
c5[++r5]=m*5;
f2=f3=f5=1;
m2=c2[f2++];
m3=c3[f3++];
m5=c3[f5++];
68
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Stive si cozi
6. Sirul lui Hamming
while (m<M) {
m=m2;
if(m>m3) m=m3;
if(m>m5) m=m5;
if (m <= M) h[++p] = m ;
c2[++r2]=m*2; c3[++r3]=m*3; c5[++r5]=m*5;
if (m == m2) m2 = c2[f2++];
if (m == m3) m3 = c3[f3++];
if (m == m5) m5 = c5[f5++];
}
69
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Cozi circulare 7. Josephus
- n copii asezati in cerc sunt numarati din m in m plecand de la copilul k.
- fiecare al m – lea copil numarat iese din cerc.
- afisare ordine iesire copii din cerc
n = 12
m=3 1 2 3 4 1 2 3 4 1 3 4 1 4
k = 2; 12 5 12 5 12
11 6 11 6 6 6
10 9 8 7 10 9 8 7 10 9 7 10 9
Afis: 2, 5, 8, 11 Afis: 3, 7, 12 Afis: 6, 1
1 4 1 4
Ordine: 2,5,8,11,3,7,12,6,1,10,4,9
6 6
10 9 10 9
70
Afis: 10, 4 Afis: 9
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Cozi circulare 7. Josephus
i = k;
cout<<poz[i]<<" ";
for (int j = i; j<n; j++) poz[j] = poz[j+1]; // eliminarea de pe pozitia k
n--;
71
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Cozi circulare 7. Josephus
while (n>0)
{
i = i+ m-1; //salt peste m pozitii
if (i%n==0) i = n; // situatie speciala in cazul numerotarii 1..n
else if (i > n) i = i % n; //simulare coada circulara
//prin pastrarea indicelui in intervalul [0,n-1];
cout<<poz[i]<<" ";
for (int j = i; j<n; j++) poz[j] = poz[j+1]; // eliminarea de pe pozitia i + m
n--;
}
72
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Liste simplu inlantuite 8. Reprezentarea vectorilor rari
Un vector rar:
- valoarea
73
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Liste simplu inlantuite 8. Reprezentarea vectorilor rari
V1 si V2 – vectori rari
V1 0 0 0 8 0 0 0 0 0 5 0 0 0 0 6 0 0 0 3 0
V2
0 0 0 0 0 0 7 0 0 4 0 0 0 0 0 0 0 0 2 0
Transformarea in liste simplu inlantuite
L1 8 4 5 10 6 15 3 19
L2 7 7 4 10 2 19
Produsul scalar = 5 x 4 + 3 x 2 = 26
L1+L2
8 4 7 7 9 10 6 15 5 19
74
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Liste simplu inlantuite 8. Reprezentarea vectorilor rari
Crearea unui vector rar
struct nod
void inserare(nod *&prim, nod *&ultim, int a, int b)
{
{ nod *q = new nod;
int poz, val;
q->val=a; q->poz=b; q->urm=NULL;
nod*urm;
};
if(prim==NULL)
{ prim = q;
ultim = prim;} void creare_vector(int &n, nod *&p, nod *&u)
else { int i,a,b;
{ ultim -> urm = q; cin>>n;
ultim = q; } for(i=1;i<=n;i++)
} {cin>>a>>b;
inserare(p, u, a, b);
}
}
75
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Suma a doi vectori rari
void suma (nod *prim1, nod *prim2, nod *&prim3, nod *&ultim3)
{ nod *p1=prim1, *p2=prim2;
while ((p1!=NULL) || (p2!=NULL))
{ if ((p2==NULL) || (p1 -> poz < p2 -> poz))
{ inserare(prim3, ultim3, p1 -> val, p1 -> poz);
p1=p1->urm; }
else
if ((p1==NULL) || (p2 -> poz < p1 -> poz))
{ inserare(prim3, ultim3, p2 -> val, p2 -> poz);
p2=p2->urm; }
else
{ inserare(prim3, ultim3, p1 -> val + p2 -> val, p1 -> poz);
p1=p1->urm;
p2=p2->urm;
}
}}
76
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Aplicatii
Liste simplu inlantuite 8. Reprezentarea vectorilor rari
77
Facultatea de Matematica si Informatica
Universitatea din Bucuresti
Structuri liniare (Liste. Stive. Cozi)
Concluzii
Succes!
78