Documente Academic
Documente Profesional
Documente Cultură
Licenciatura
em
Inform0ca
Disciplina:
Estrutura
de
dados
e
algoritmos
CHT:
60hs
Professor:
Srgio
Souza
Costa
E-mail:
skosta@gmail.com
Turma:
2010.2,2010.1
e
2009.2
Perodo:
3
Ano/Semestre:2/2012
Pilha
e
Fila
Dinmica
Pilha
Dinmica
A
pilha
que
codicamos
anteriormente
era
est0ca,
dado
que
u0lizava
vetores.
Agora
que
j
codicamos
a
lista
encadeada,
podemos
u0liza-la
para
codicar
nossa
pilha
dinmica.
Antes
de
prosseguir,
pense
como
seria
este
cdigo.
Pilha
Dinmica
A
estrutura
da
pilha
bem
simples,
precisando
apenas
de
uma
lista
para
armazenar
os
elementos.
Como
a
lista
dinmica,
a
pilha
tambm
dinmica.
typedef struct {!
Lista* l;!
} Pilha;
Pilha
dinmica
Agora
precisamos
codicar
o
0po
abstrato
lista,
codicando
as
mesmas
operaes
que
foram
codicadas
para
a
pilha
est0ca.
Pilha*
criaPilha
();
int
pilhaVazia();
void
empilha
(Pilha
*p,
int
x);
int
desempilha();
int
topo();
int
pilhaCheia
(Pilha
*p);
Operaes
da
Pilha
1. Alocamos
a
rea
de
memria
da
pilha.
2. Inicializamos
a
lista
da
pilha
com
lista
vazia.
3. Retornamos
a
pilha.
Pilha* criaPilha (){!
Pilha* p = !
1.
" " "(Pilha*)malloc (sizeof(Pilha));!
2.
p->l = Vazia();!
3.
return p;!
}
Operaes
da
pilha
Vericar
se
a
pilha
esta
vazia
vericar
se
a
lista
esta
vazia.
int pilhaVazia (Pilha* p) {!
return p->l == Vazia();!
}
Operaes
da
pilha
Empilhar
um
elemento
X
na
pilha
adicion-lo
na
lista.
void empilha (Pilha *p, int x) {!
p->l = Cons (x, p->l);!
}
Operaes
da
pilha
Retornar
o
elemento
do
topo
retornar
o
elemento
que
est
na
cabea
da
lista,
ou
seja,
o
l0mo
adicionado.
int topo (Pilha* p) {!
return cabeca(p->l);!
}!
Operaes
da
pilha
A
operao
desempilha,
alm
de
retornar
o
elemento
do
topo
da
pilha,
precisa
remov-lo.
int desempilha (Pilha* p) {!
"int x = topo (p);!
p->l = calda (p->l);!
return x; !
!
}
Remove o
elemento da
cabea da pilha
Codicando
Adicionando
a
operao
que
insere
um
elemento
no
m
da
lista.
Lista* insereFim (int x, Lista* l) {!
Lista* aux;!
if (l == Vazia()) return Cons (x, l);!
aux = l; " "!
while (calda(aux)) !
aux = calda(aux);!
aux->calda = Cons (x, Vazia());!
return l;!
}
Codicando
Adicionando
a
operao
que
insere
um
elemento
no
m
da
lista.
Lista* insereFim (int x, Lista* l) {!
Lista* aux;!
if (l == Vazia()) return Cons (x, l);!
aux = l; " "!
while (calda(aux)) !
aux = calda(aux);!
aux->calda = Cons (x, Vazia());!
return l;!
}
Se minha lista
vazia, ento j
estou no fim da
lista.
Codicando
Adicionando
a
operao
que
insere
um
elemento
no
m
da
lista.
Lista* insereFim (int x, Lista* l) {!
Lista* aux;!
if (l == Vazia()) return Cons (x, l);!
aux = l; " "!
while (calda(aux)) !
aux = calda(aux);!
aux->calda = Cons (x, Vazia());!
return l;!
}
Ou preciso
percorrer a lista at
o fim.
Codicando
Adicionando
a
operao
que
insere
um
elemento
no
m
da
lista.
Lista* insereFim (int x, Lista* l) {!
Lista* aux;!
if (l == Vazia()) return Cons (x, l);!
aux = l; " "!
while (calda(aux)) !
aux = calda(aux);!
aux->calda = Cons (x, Vazia());!
return l;!
}
Ento posso
adicion-lo ao fim
da lista.
Ponteiro nulo,
representa
lista vazia.
Ponteiro nulo,
representa
lista vazia.
Adicionar no fim
adicionar um novo n
neste ponto
Ponteiro nulo,
representa
lista vazia.
Ponteiro nulo,
representa
lista vazia.
7
Volte ao cdigo e releiao buscando entender
melhor o seu
funcionamento antes de
prosseguir.
.
Ponteiro nulo,
representa
Calda, referido tambm
como prximo
lista vazia.
Codicando
A
estrutura
vai
ser
similar
a
da
pilha,
apenas
com
um
atributo
que
a
lista:
typedef struct { !
Lista* l;!
}Fila;
Codicando
O
construtor
tambm
similar
ao
da
pilha.
Fila* criaFila () {!
"Fila* f = !
(Fila*) malloc (sizeof(Fila));!
"f->l = Vazia();!
"return f;"!
}
Codicando
A
desenleira
similar
a
desempilha.
int desenfileira (Fila* f) {!
int x = cabeca (f->l);!
f->l = calda (f->l);!
return x; !
}
Codicando
Na
enleira
chamamos
a
operao
que
insere
um
elemento
no
m
da
lista.
void enfileira (Fila* f, int x) {!
f->l = insereFim(x,f->l);!
}
Experimentem
todos
os
cdigos
feitos
nesta
aula
e
as
a0vidades
postadas
no
site.
At
logo
!