Documente Academic
Documente Profesional
Documente Cultură
Laborator 8
Descriere: Structuri de date
1. Introducere
Scopul listelor este de a memora un ansamblu finit de elemente al caror numar nu este cunoscut
apriori. Listele sunt structuri de date dinamice, ın sensul ca numarul elementelor variaza in timpul
executiei programului, prin adaugari sau stergeri de elemente. Operatiile care pot fi efectuate pe o
lista sunt:
testarea daca lista este vida
adaugarea de elemente
verificarea daca un element este ın lista
stergerea unui element
1. Lista liniara
O lista liniara este o secventa finita (e0, ... , en-1) de elemente. Componentele unei liste nu trebuie sa
fie neaparat distincte; putem avea i ≠ j si ei = ej . Lungimea unei liste L = (e0, ... , en-1), notata cu
Lung(L), este data de numarul de componente din lista: Lung(L) = n. Lista vida ( ) este lista fara
nici o componenta (de lungime 0). Fiecare element al listei contine pe langa informatia efectiva si
adresa elementului urmator, numit si pointer. Java permite realizarea listelor cu ajutorul claselor si
obiectelor: celulele unei liste sunt obiecte ın care o variabila de clasa contine o referinta catre celula
urmatoare.
class Lista {
int continut;
Lista urmator;
1.1 Operatii
Cauta. Verifica daca un element dat x apare intr-o lista liniara data L. Metoda efectueaza o
parcurgere a listei. Variabila a este modificata iterativ prin a=a.urmator pentru a parcurge
elementele listei pana se gaseste x sau pana se gaseste sfarsitul listei (a = null)
Intrare: o lista liniara L = (e0, ... , en-1) si un element x
Iesire: false, daca x nu apare in L
true, daca x apare in L
Elimina. Elimina un element dat dintr-o lista liniara data. Eliminarea unei celule care contine x se
face modificand valoarea campului urmator continut ın predecesorul lui x: succesorul
predecesorului lui x devine succesorul lui x. Un tratament particular trebuie facut daca elementul
care trebuie eliminat este primul element din lista.
Intrare: o lista liniara L = (e0, ... , en-1) si un element x
Iesire: lista L din care s-au eliminat toate elementele ei egale cu x.
2. Cozi
Cozile sunt liste liniare particulare utilizate ın programare pentru gestionarea obiectelor care sunt ın
asteptarea unei prelucrari ulerioare, de exemplu procesele de asteptare a resurselor unui sistem,
nodurile unui graf, etc. Elementele sunt adaugate sistematic la coada si sunt eliminate din capul
listei. Aceasta strategie este FIFO (First In First Out), ın opozitie cu strategia LIFO (Last In First
Out) utilizata la stive.
class Coada {
Coada () {
inceput = 0;
sfarsit = 0;
plina= false;
vida = true;
info = new int[MaxC];
}
c.info[c.sfarsit] = x;
c.sfarsit = succesor(c.sfarsit);
c.vida = false;
c.plina = c.sfarsit == c.inceput;
}
c.inceput = succesor(c.inceput);
c.vida = c.sfarsit == c.inceput;
c.plina = false;
}
2. Stive
Notiunea de stiva intervine ın mod curent ın programare, rolul sau principal fiind la implementarea
apelurilor de proceduri. O stiva se poate imagina ca o cutie ın care sunt plasate obiecte si din care
se scot ın ordinea inversa fata de cum au fost introduse: obiectele sunt puse unul peste altul ın cutie
si se poate avea acces numai la obiectul situat ın varful stivei. Realizarea operatiilor asupra stivelor
se poate face utilizand un tablou care contine elementele si un indice care indica pozitia varfului
stivei.
class Stiva {
Stiva() {
inaltime = 0;
continut = new Element[maxP];
}
ASD
s.continut[s.inaltime] = x;
++s.inaltime;
}
adauga(new Element(true,0,'+'),ss);
System.out.println(valoare(ss));
}
}
class Element {
boolean esteOperator;
int valoare;
char simbol;
Vom ilustra utilizarea stivelor printr-un program de evaluare a expresiilor aritmetice scrise sub o
forma particulara. In programare o expresie aritmetica poate contine numere, variabile si operatii
aritmetice (ne vom limita numai la + si *). Vom considera ca intrari numai numere naturale.
class Element {
boolean esteOperator;
int valoare;
char simbol;
Vom utiliza functiile definite pentru stiva si procedurile definite ın cele ce urmeaza.
9
5 7 ^ ^
35 + + + + 15 15
+ + 71 71 71 ^ ^ ^ ^ ^
* * * * * * 781 781 781 781 781 781
+ + + + + + + + + + + + +
Program complet
class Stiva {
Stiva() {
inaltime = 0;
continut = new Element[maxP];
}
s.continut[s.inaltime] = x;
++s.inaltime;
}
Element y, op;
return valoare(s).valoare;
}
if (s.equals("+") || s.equals("^"))
exp[i] = new Element (true, 0, s.charAt(0));
else
exp[i] = new Element (false, Integer.parseInt(s), ' ');
}
System.out.println("Elemente");
for(int i=0;i<args.length;i++)
System.out.println(exp[i]);
System.out.println("===============");
}
}
class Element {
boolean esteOperator;
int valoare;
char simbol;
import java.util.*;
import java.io.*;
class Test{
static Vector v;
System.out.println("Pozitia: "+
String.valueOf(v.indexOf(obj)+1));
else
System.out.println("Elementul nu este in vector");
}
c=in.readLine().charAt(0);
switch(c){
case '1':
System.out.print("Dati elementul: ");
adauga(in.readLine());
break;
case '2':
System.out.print("Dati elementul: ");
sterge(in.readLine());
break;
case '3':
System.out.print("Dati elementul: ");
contine(in.readLine());
break;
case '4':
System.out.print("Dati elementul: ");
gaseste(in.readLine());
break;
case '5':
capacitate();
break;
case '6':
primul();
break;
case '7':
ultimul();
break;
case '8':
System.out.println("Dati pozitia: ");
int p=Integer.parseInt(in.readLine());
elementDePePozitie(p);
break;
case '9':
ASD
listeaza();
break;
case 'e':
System.exit(1);
}
}
}catch(NumberFormatException e){
System.err.println("Introduceti corect numerele!");
}catch(IOException e){}
}
}
Probleme
1. Realizati un program initializeaza o lista liniara si executa operatiile specifice asupra listei
(testare daca lista este vida, adaugare, afisare elemente, cautare element, stergere).
2. Realizati un program care evalueaza expresii aritmetice in prefixate. Elementele din expresie vor
fi preluate dintr-un fisier