Sunteți pe pagina 1din 35

Curso:

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);

No necessria. Por que ?

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

Ser que posso codicar uma la dinmica


usando a lista encadeada que j tenho
pronta? O que vocs acham ?

A la difere da pilha pelo fato de que na


pilha inserimos e removemos de uma
mesma extremidade. Na la eu insiro em
uma extremidade e remove em outra.

Ento, preciso criar mais uma operao


para a lista. Qual seria ?

Ento, preciso criar mais uma operao


para a lista. Qual seria ?

InsereFim, que ir inserir o elemento no
m 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;!
}

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.

No entendi muito bem, este cdigo


itera0vo, os que 0nha feito at ento era
todos recursivo.

Vou agora usar uma


representao grca
comum para lista. Ela pode
te ajudar a entender este
cdigo

Ponteiro nulo,
representa
lista vazia.

Calda, referido tambm


como prximo

Ponteiro nulo,
representa
lista vazia.

Calda, referido tambm


como prximo

Adicionar no fim
adicionar um novo n
neste ponto

Ponteiro nulo,
representa
lista vazia.

Calda, referido tambm


como prximo

Ponteiro nulo,
representa
lista vazia.

Ento, percorremos a lista at que


Adicionar no fim
a calda seja nula, ou seja, no
adicionar um novo n tenha mais n. Ento adicionamos
neste ponto
um novo n neste ponto.

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.

Ento, percorremos a lista at que


Adicionar no fim
a calda seja nula, ou seja, no
adicionar um novo n tenha mais n. Ento adicionamos
neste ponto
um novo n neste ponto.

Acho que agora j sei como codicar a la


dinmica.

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 !

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