Você está na página 1de 8

Filas

Professor Srgio Furgeri

Filas
Fila um tipo de lista linear onde as inseres so realizadas num extremo (final da Fila) e
as remoes restritas ao outro (comeo da Fila).
O primeiro a entrar o primeiro a sair e ltimo a entrar tambm o ltimo a sair (FIFO First-In/First-Out).
A ordem de sada corresponde diretamente ordem de entrada dos elementos.
Exemplo Fsico:

Fila de caixa bancrio


Patindo da palavra ingles queue que significa fila, so denominadas duas operaes bsicas
suportadas pelas Filas:

Enqueue: insere um elemento no final da Fila.


Dequeue: remove um elemento do comeo da Fila.

Exemplo de Instrues
Enqueue (F, x) aumenta o tamanho da Fila F, acrescentando o elemento x no seu final.
Dequeue (F, x) diminui o tamanho da Fila F, removendo e retornando o elemento
posicionado no comeo da Fila.
Exemplo do uso das instrues da Fila (representao grfica)
Operao
----------------Enqueue(F, a)
Enqueue(F, b)
Enqueue(F, c)
Enqueue(F, d)
Dequeue(F)
Dequeue(F)
Enqueue(F, e)

Estado da Fila
F:[ ]
F:[ a ]
F:[ a, b ]
F:[ a, b, c ]
F:[ a, b, c, d ]
F:[ b, c, d ]
F:[ c, d ]
F:[ c, d, e ]

Resultado
----------------------------------------------------------------------a
b
---------------

Pgina 1

Filas

Professor Srgio Furgeri


Enqueue(F, f)
Enqueue(F, Dequeue (F))

F:[ c, d, e, f ]
F:[ d, e, f ]
F:[ d, e, f , c ]
F:[ e, f , c ]
F:[ f , c ]
P:[ c ]

Dequeue(F)
Dequeue(F)
Dequeue(F)

--------------c
--------------d
e
f

Representao grfica de Filas


comeo
F: a

final
c

...

Implementao de Filas em Pascal


A implementao das Filas vivel quanto temos trs recursos bsicos:
Espao de memria para armazenar os elementos;
Uma referncia ao primeiro elemento da coleo;
Uma referncia primeira posio livre, aps o ltimo elemento da fila.
De acordo com as caractersticas da Fila, poderemos usar:
um vetor para alocar o espao de memria seqncial.
duas variveis inteiras para referenciar o primeiro elemento e a primeira
posio disponvel no final da fila.
Para ser criada uma Fila pode ser usada a estrutura RECORD:
const MAX = 50;
type Elem = char;
Fila = record
comeo: integer;
final : integer;
memo : array[1..MAX] of Elem;
end;
var F: Fila;

Exemplo de armazenamento de uma fila F:[ a, b, c ]

Pgina 2

Filas

F: 1

Professor Srgio Furgeri

F.comeco
F.final
F.memo
4

1 2

...
4

...

max

Inicializar a fila, indicando que est vazia;


medida que elementos so inseridos, o ndice F.final se desloca para direita,
acontecendo da mesma forma para o ndice F.comeco, que indicar a prxima
posio disponvel.
O ndice F.comeco ir sempre perseguir F.final, at quando a fila no conter mais
nenhum elemento, pois teremos F.comeco igual a F.final. A seguir a representao
de esvaziamento da fila:
Fila no seu estado inicial
F: 1

c ...

2 3 ... max

Removendo o elemento b
F: 3

c ...

2 3 ... max

Removendo o elemento a
F: 2

c ...
... max

Removendo o elemento c
F: 4

c ...
... max

Algoritmo para Manipulao da Fila:


a) Inicializao da Fila
procedure Qinit(var F: Fila);
begin
F.comeco:= 1;
F.final:= 1;
end;

Consideraes:
Indicar o valor 1 a F.comeco e F.final deixando-os iguais e tambm mostrando
que a fila est vazia e a primeira posio do vetor F.memo est disponvel para
insero.
Inicia com valor 1 pois o vetor vai de 1..MAX, no podendo haver valor na
posio 0.
b) Limites da Fila
Pgina 3

Filas

Professor Srgio Furgeri


function QisEmpty(var F: Fila): boolean;
begin
QisEmpty:= (F.comeco = F.final);
end;
function QisFull(var F: Fila): boolean;
begin
QisFull:= (F.final > max);
end;

Consideraes:
Por que usar funo no lugar de procedimento?
Quando a Fila est vazia?
Quando a Fila est cheia?
A passagem por referncia dada, mas no obrigatria, uma vez que no
existe a necessidade de se alterar o valor da Fila. Entretanto, no necessrio criar
uma nova varivel para copiar a pilha na memria (quanto > MAX > Tempo)
c) Inserindo elementos na Fila
procedure Enqueue(var F:Fila; x: Elem);
begin
if not QisFull(F) then
begin
F.memo[F.final]:=x;
F.final:=F.final +1;
end
else
writeln(Queue Overflow);
end;

Consideraes:
H espao para uma nova insero? Se no, mensagem Queue Overflow
Insere um novo elemento no final da Fila.
Incrementa o valor do final.
d) Retirando elementos da Fila
function Dequeue(var F: Fila): Elem;
begin
if not QisEmpty(F) then
begin
Dequeue:= F.memo[F.comeco];
F.comeco:= F.comeco + 1;
end
else
writeln(Queue Underflow);
end;

Consideraes:

Pgina 4

Filas

Professor Srgio Furgeri

A Fila est vazia?


Remover sempre do comeo da Fila.
Retorna o elemento decrementado do comeo da Fila.
Se tentar remover um elemento da Fila vazia, mensagem Queue Underflow.

Problemas na Inplementao Seqencial de Filas


Exemplo:
- uma determinada fila com capacidade de armazenamento de 5 elementos (max = 5).
Representao de um fila cheia
F: 1

2 3

Sempre que um elemento removido, o ndice que indica o comeo desloca-se para
a direita.
Se inicialmente ele vale 1, aps todos os elementos derem sido removidos da Fila a
situao ser:
Representao de um fila: est cheia ou vazia?
F: 1 6 a b c d e
1 2

Onde: a funo QisFull( ) indica que no h espao livre (F.final > max) se for
inserir um elemento e a funo QisEmpty dir que a fila est vazia (F.comeco =
F.final) se tentarmos remover um elemento.
Deperdcio de memria e Problemas de lgica.

Solucionando Problemas de Implementao Seqencial


-

Acrescentar uma varivel que sirva de contador para saber quanto elementos
contm a Fila.
Inicialmente a varivel deve ser zerada.
Deve ser atualizao sempre que for adicionado ou removido algum elemento.
F: 3

2 5

a b
1 2

c
3

d
4

Pgina 5

Filas

Professor Srgio Furgeri

O desperdcio de espao pode ser sanado com uma posio prontamente disponvel,
ou seja, a posio 1 estar localizada imediatamente aps a posiao max, indicando
que a fila est cheia e no h espao livre conforme a representao abaixo:
Representao circular de uma fila
1
max
a
2
...
b
c

final
5
-

comeo

d
4

Alocando a rea de memria conforme a figura acima, um ndice i com valor


max+1 apontaria primeira posio, com valor max+2 apontaria a segunda posio e
assim por diante, porm as clulas de memria so dispostas de forma linear e no
em crculo.
Para isso, necessrio que sempre que for incrementado e seu valor ultrapassar a
constante max, seu valor ser definido com 1.
procedure adc(var i:integer);
begin
i:= i+1;
if i>max then i:= 1;
end;

Implementao Circular para Filas


Obs:
-

Note que a rotina adc, no estar disponvel aos usurios em Filas.tpu, pois no est
declarada na seo interface sendo assim exclusivamente de uso restrito da unidade.
Sero usadas para incremento e decremento as rotinas predefinidas pela linguagem
Pascal, inc() e dec() respectivamente.

unit Filas;
interface
const max = 50;
type Elem = char;
Fila = record
total : integer;
comeco: integer;
final : integer;
memo: array[1..max] of Elem;
end;

Pgina 6

Filas

Professor Srgio Furgeri


procedure Qinit(var F: Fila);
function QisEmpty(var F: Fila): boolean;
function QisFull(var F: Fila): boolean;
procedure Enqueue(var F: Fila) x: Elem;
function Dequeue(var F: Fila): Elem;

implementation
procedure Qinit(var F: Fila);
begin
F.total:= 0;
F.comeco:= 1;
F.final:= 1;
end;
function QisEmpty(var F: Fila): boolean;
begin
QisEmpty:= (F.total = 0);
end;
function QisFull(var F: Fila): boolean;
begin
QisFull:= (F.total = max);
end;
procedure abc(var i:integer);
begin
i:= i+1;
if i>max then i:= 1;
end;
procedure Enqueue(var F:Fila; x: Elem);
begin
if not QisFull(F) then
begin
F.memo[F.final]:=x;
adc(F.final);
inc(F.total);
end
else
writeln(Queue Overflow);
end;
function Dequeue(var F: Fila): Elem;
begin
if not QisEmpty(F) then
begin
Dequeue:= F.memo[F.comeco];
adc(F.comeco);
dec(F.total);
end
else
writeln(Queue Underflow);
end;
end.

Pgina 7

Filas

Professor Srgio Furgeri

Exerccios
1. Mostre a situao de uma fila F, inicialmente vazia. Aps a execuo de cada uma
das seguintes operaes:
Enqueue(F, a);
Enqueue(F, d);
Enqueue(F, e);
Dequeue(F);

Enqueue(F, b);
Dequeue(F);
Dequeue(F);
Enqueue(F, g);

Enqueue(F, c);
Dequeue(F);
Enqueue(F, f);
Enqueue(F, Dequeue(F));

2. O impasse filavazia/cheia, na implementao circular, foi solucionado com o uso de


uma varivel contadora. Uma outra forma de resolver o problema seria impedir que
o ndice final alcanasse o ndice comeo, deixando sempre pelo menos uma
posio livre entre o primeiro e o ltimo elemento da fila. Apresente uma nova
implementao circular para o tipo Fila que se baseie neste princpio para detectar
fila vazia/cheia.
3. Vimos que uma fila dupla uma lista linear na qual os elementos podem ser
inseridos ou removidos de qualquer extremo. Baseando-se na implementao
circular apresentada para filas, codifique uma unidade de rotinas para manipulaao
de filas duplas. A unidade deve conter rotinas para inicializar, testar fila vazia/cheia,
inserir esquerda, inserir direita, remover esquerda e tambm direita.
4. Dependendo do conjunto de operaes que decidimos aplicar sobre uma varivel do
tipo fila dupla, ela poder se comportar como uma pilha ou ento como uma fila.
Isto seria vantajoso numa aplicao que precisasse usar tanto pilhas quanto filas,
pois bastaria ter uma implementao de fila dupla. Mostre como uma fila dupla
pode funcionar como:
a) uma pilha
b) uma fila
5. possvel que uma nica fila dupla seja utilizada para representar duas pilhas
distintas. Admitindo que a implementao solicitada no exerccio 3 esteja
disponvel, utilize as operaes de fila dupla para desenvolver rotinas para
inicializar, inserir e remover objetos destas pilhas.
6. Seria possvel utilizar uma fila dupla para representar duas filas simples?
7. Considerando que voc tem a disposio duas pilhas. Mostre como elas podem ser
utilizadas em conjunto para simular o funcionamento de uma fila. [Dica: utilize uma
pilha como espao de armazenamento e a outra como espao auxiliar para
operaes de movimentao de dados].

Pgina 8

Você também pode gostar