You are on page 1of 16

Curso Superior de Tecnologia em Telemtica

Programao e Estruturas de Dados

Filas Fundamentos e Implementaes


Copyright2010
Prof. Csar Rocha
cesarocha@ifpb.edu.br 1

Objetivos
Explorar os conceitos fundamentais acerca do uso
de filas utilizando a linguagem C
Organizao e implementao, caractersticas,
vantagens, desvantagens, regras de utilizao,
operaes bsicas e algoritmos de implementao

Neste mdulo, sero abordadas ainda as seguintes


implementaes de filas: seqencial, encadeada
e circular
Este mdulo ser utilizado como referncia na
entrega dos futuros projetos
Implementao das estruturas e algoritmos, criao
das bibliotecas e prticas de laboratrio

Motivao
Uma das estruturas de dados mais utilizadas em
programao a fila
Um exemplo de utilizao em computao a
implementao de uma fila de impresso

Assim como na pilha, os acessos aos elementos em


uma fila tambm seguem uma regra :
Lembre-se da pilha, onde: Last In First Out
Porm, uma fila : First In First Out

A idia fundamental
S podemos inserir um novo n no final da fila
S podemos retirar a partir do incio da fila

Estratgia
Pode-se fazer uma analogia com uma fila de clientes
em um banco qualquer:
o primeiro a entrar na fila, ser o primeiro a sair e ser
atendido (retiramos ele do incio ou frente da fila)
o ltimo cliente deve entrar no final da fila e, portanto,
ser o ltimo a sair (ou ser atendido) na fila

Portanto:
No podemos retirar qualquer cliente da fila!
Apenas clientes que esto na frente da fila

No podemos inserir um cliente na fila de tal forma


que ele no seja o ltimo no conjunto de clientes

Propriedades
Propriedades de uma fila:

Existem n elementos enfileirados;


E1 o elemento no incio (ou frente) da fila;
En o ltimo elemento da fila;

A insero de um primeiro elemento E1 em uma fila


vazia, torna-o o primeiro a sair da estrutura
No se pode consultar qualquer elemento
A insero sempre feita depois do elemento En
A retirada sempre feita no elemento E1
5

Tipos de filas
Neste estgio, estaremos trabalhando com trs
tipos de filas: seqenciais, encadeadas e circulares
Seqencial: neste TAD, os elementos da fila so
armazenados em endereos seqenciais. Materializada
na forma de um vetor (arranjo ou matriz).
v[ ]

preciso
preciso controlar
controlar
oo incio
incio ee oo final
final da
da
fila.
fila. Note
Note os
os campos
campos
frente
frente ee fim.
fim.
Como
Como poderamos
poderamos
adaptar
adaptar uma
uma lista
lista
seqencial
seqencial uma
uma
fila?
fila?

Fila Vazia

...

Frente= 0 e Fim= -1

Insere A

...

Frente= 0 e Fim= 0

Insere B

...

Frente= 0 e Fim= 1

Insere C

...

Frente= 0 e Fim= 2

Retira

...

Frente= 1 e Fim= 2

Tipos de filas
(Continuao.)
Encadeada: neste TAD, os elementos da fila so
elementos encadeados por ponteiros
TFilaEnc f*

12

09

Circular: caso particular de filas. Iremos levantar e


comentar a necessidade da implementao circular
mais frente

Importante: so apenas diferentes maneiras de se


implementar o TAD, porm todas as trs formas
seguem a mesma filosofia First In First Out

Filas seqenciais
Pense um pouco...
O que voc acha que seria necessrio para
implementar uma biblioteca de um novo TAD que
representasse uma fila seqencial?
um vetor de elementos (tamanho pr-definido)
duas variveis que controlem a frente e o fim da fila
/*
/* estruturao
estruturao */
*/
typedef
typedef struct
struct fila {
int
int elementos[MAX];
elementos[MAX];
int
int frente;
frente;
int
int fim;
fim;
}TFila;
}TFila;

/*
/* filaseq.h
filaseq.h */
*/
void
void criarFila(TFila
criarFila(TFila *fila);
*fila);
int
int filaVazia(TFila
filaVazia(TFila *fila);
*fila);
int
int filaCheia(TFila
filaCheia(TFila *fila);
*fila);
int
int enfileirar(TFila
enfileirar(TFila *fila,
*fila, int
int dado);
dado);
int
int desenfileirar(TFila
desenfileirar(TFila *fila,
*fila, int
int *d);
*d);
void
void imprimir(TFila
imprimir(TFila *fila);
*fila);

Mas... h problemas!
Voc deve ter percebido que a parte ocupada do
vetor pode chegar ultima posio
Ou seja, a fila seqencial vai se deslocando da
esquerda (frente) para direita (fim) em cada retirada
?

Frente= 1 e Fim= 2

Insere E e F

Frente= 1 e Fim= 4

Retira C

Frente= 2 e Fim= 4

Insere G

Frente= 2 e Fim= 4

Fila

Existem dois elementos vazios na fila, mas nenhum


outro elemento pode mais ser inserido!
fila.fim chegou condio de limite (MAX -1)

Mas... h problemas!
E agora?
Do jeito que est, pode-se chegar a uma situao
(absurda) em que a fila estar vazia, mas nenhum
elemento novo poder mais ser inserido!
Concluso: a representao seqencial, descrita
anteriormente, parece no ser muito boa!

Poderamos mudar a funo desenfileirar()


E fazer o deslocamento esquerda de todos os
elementos a cada retirada na frente da fila, mas...
...e se a fila tivesse 100 elementos?

Havamos criticado o deslocamento da lista seqencial!

10

Soluo
O que se quer reaproveitar as primeiras posies
livres do vetor sem implementar um re-arranjo
(trabalhoso) de todos os elementos a cada retirada
Para isso, pode-se incrementar as posies do vetor de
maneira circular
Ou seja, se o ltimo elemento da fila ocupar a ltima
posio do vetor, inserimos os novos elementos a partir
do incio do vetor!

Graficamente:
Insere G

Frente= 2 e Fim= 0

11

Filas encadeadas
O que fazer quando o nmero mximo de elementos
na fila no conhecido?
Devemos implementar a fila usando uma estrutura de
dados dinmica (com alocao dinmica)
dinmica
Podemos empregar os conceitos vistos nas listas
simplesmente (ou duplamente) encadeadas

Entretanto, as regras de insero/remoo, agora,


iro mudar!
Algumas funes da lista encadeada (inserir ou remover
mediante uma posio qualquer, entre outras) devero
ser eliminadas neste novo TAD
12

Filas encadeadas - modus operandi


O primeiro elemento (incio) da lista encadeada poder
representar a frente atual da fila
Assim, cada novo elemento ser inserido no final da lista.
Conseqentemente e, sempre que solicitado, retiramos o
elemento a partir do incio da lista
Desta forma, vamos precisar de apenas duas funes
auxiliares na lista:
uma para inserir no fim (enfileirar)
outra para remover do incio (desenfileirar)
H apenas uma desvantagem:
Para cada elemento a ser inserido na fila, teremos que
percorrer todos os nodos at encontrar o ltimo.

13

Fila encadeada com n descritor


Vamos utilizar os conhecimentos auferidos em
tcnicas de encadeamento!
Neste caso em particular, iremos alocar um n
cabea para que possamos ter acesso direto ao
final da fila (promover performance)
TFilaEncCab f
Vantagens
Vantagens

Cabea

03

Acesso
Acesso direto
direto ao
ao
primeiro
primeiro nodo
nodo;;
Acesso
Acesso direto
direto ao
ao
ltimo
ltimo nodo
nodo;;
Informao
Informao sobre
sobre oo
tamanho
tamanho da
da lista
lista..

100

110

120

14

Algoritmos em C
O que dever ser feito pelo aluno:
Escolha e instalao do ambiente a ser trabalhado no
laboratrio
Modelagem deste TAD (dados e operaes)
Implementao dos algoritmos de operaes bsicas
vistos em sala de aula na linguagem C
Utilizao das regras de modelagem vistas no mdulo
anterior (criao de bibliotecas) e modularizao
Implantao de cdigo legvel e bem documentado
Nomes de variveis condizentes com o problema
Prtica de laboratrio

15

Para um bom aproveitamento:


O aluno deve identificar a relao entre TAD
(biblioteca e modularizao) com a implementao
da fila no cdigo!
Resolva todas as questes da prtica de
laboratrio de filas circular e encadeada
Procure o professor ou monitor da disciplina e
questione conceitos, listas, etc.
No deixe para codificar tudo e acumular assunto
para a primeira avaliao.
Este apenas um dos assuntos abordados na prova!
16