Escolar Documentos
Profissional Documentos
Cultura Documentos
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:
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
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
final
c
...
Pgina 2
Filas
F: 1
F.comeco
F.final
F.memo
4
1 2
...
4
...
max
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
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
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
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.
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
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
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
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
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));
Pgina 8