Representação de Filas com a
Estrutura Lista e Operações.
Departamento de Engenharia de Computação
Algoritmos e Estruturas de Dados
07/12/2016
1
AGENDA
Introdução
Operações
Implementação com lista circular
07/12/2016
2
INTRODUÇÃO
 É uma lista linear.
 É uma lista FIFO – first in / first out – primeiro a entrar primeiro a
sair.
 As inserções ocorrem no final da fila e as remoções no inicio da
fila. Não há inserção e remoção no meio da fila.
 Pode ser uma lista dinâmica que aumenta ou diminui durante a
sua existência.
3
Exemplos
Balcão de atendimento;
Fila de banco;
Fila de processos aguardando os recursos do sistema
operacional;
Fila de pacotes a serem transmitidos numa rede de
comutação de pacotes;
Fila de caixa em banco;
Etc.
07/12/2016
4
Operações
 ENQUEUE: insere um novo elemento no final da fila, aumentando
o tamanho da fila.
 DEQUEUE: remove um elemento do inicio da fila, diminuindo o
tamanho da fila.
07/12/2016
5
inicio final
FILA (F)
Operações
 Init: inicializa a fila no estado vazia (NIL ou NULL), definindo um
um estado inicial.
 IsEmpty: verifica se a fila está vazia. Do tipo booleano: retorna
TRUE somente se estiver vazia.
 IsFull: verifica se a fila está cheia. Do tipo booleano: retorna TRUE
somente quando não há mais espaço de armazenamento.
(somente se a Fila for estática)
07/12/2016
6
Implementações
Fila Estática Sequencial (Vetores)
Fila Estática Circular (Vetores)
Fila Dinâmica Circular (Lista Simplesmente Encadeada
Circular)
07/12/2016
7
Fila Circular
8
07/12/2016
30
20
55
8763
41
...
INÍCIO
FINAL
1
2
3
45
6
MÁXIMO
Fila Circular
9
07/12/2016
...
INÍCIO
FINAL
1
2
3
45
6
MÁXIMO
LISTA VAZIA!
Fila Circular
10
07/12/2016
...
INÍCIO
FINAL
1
2
3
45
6
MÁXIMO
Inserindo o primeiro elemento no final da fila: ENQUEUE (F, 35.1)
35.1
Fila Circular
11
07/12/2016
...
INÍCIO
FINAL
1
2
3
45
6
MÁXIMO
Inserindo o segundo elemento no final da fila: ENQUEUE (F, 10.7)
35.1
10.7
Fila Circular
12
07/12/2016
...
INÍCIO
FINAL
1
2
3
45
6
MÁXIMO
Inserindo o terceiro elemento no final da fila: ENQUEUE (F, 243.6)
35.1
10.7
243.6
Fila Circular
13
07/12/2016
...
INÍCIO
FINAL
1
2
3
45
6
MÁXIMO
Removendo um elemento do início da fila: DEQUEUE (F, 35.1)
35.1
10.7
243.6
Fila Circular
14
07/12/2016
...
INÍCIO
FINAL
1
2
3
45
6
MÁXIMO
10.7
243.6
A fila ficará dessa forma após a remoção!
Fila Circular
15
07/12/2016
...
INÍCIO
FINAL
1
2
3
45
6
MÁXIMO
Removendo um elemento do início da fila: DEQUEUE (F, 10.7)
10.7
243.6
Fila Circular
16
07/12/2016
...
INÍCIO
FINAL
1
2
3
45
6
MÁXIMO
243.6
A fila ficará dessa forma após a remoção!
Fila Circular
17
07/12/2016
...
INÍCIO
FINAL
1
2
3
45
6
MÁXIMO
Inserindo um elemento no final da fila: ENQUEUE (F, 0.1)
243.6
0.1
Fila Circular
18
07/12/2016
...
INÍCIO
FINAL
1
2
3
45
6
MÁXIMO
Inserindo um elemento no final da fila: ENQUEUE (F, 15.8)
243.6
0.1
15.8
Fila Circular
19
07/12/2016
...
INÍCIO
FINAL
1
2
3
45
6
MÁXIMO
Inserindo um elemento no final da fila: ENQUEUE (F, 8.7)
243.6
0.1
15.8
8.7
Fila Circular
20
07/12/2016
...
INÍCIO
FINAL
1
2
3
45
6
MÁXIMO
Removendo um elemento no início da fila: DEQUEUE (F, 243.6)
243.6
0.1
15.8
8.7
Fila Circular
21
07/12/2016
...
INÍCIO
FINAL
1
2
3
45
6
MÁXIMO
0.1
15.8
8.7
A fila ficará dessa forma após a remoção!
Implementação: Definição
type
tipo_dado = integer;
tipo_fila = ^tipo_no;
tipo_no = record
dado: tipo_dado;
proximo: tipo_fila;
end;
07/12/2016
22
Implementação: Criação da Fila
Procedure Cria_Fila(var fila:tipo_fila);
begin
fila := Nil;
pAux1 := Nil;
pAux2 := NIl;
writeln('Fila Criada com Sucesso!');
end;
07/12/2016
23
Implementação: isEmpty
Function Vazia(fila: tipo_fila): boolean;
begin
Vazia := ( fila = Nil );
end;
07/12/2016
24
Implementação: Dequeue Parte 1
function Dequeue():tipo_dado;
begin
//verifica se a fila está vazia
if(fila = nil)then
begin
writeln(' A fila está vazia! ');
end
else
begin
//remove se a fila tem apenas um
elemento
if(fila^.proximo = fila)then
begin
//remove o elemento
Dequeue := fila^.dado;
//desaloca memória
dispose(fila);
fila := nil; //inicio da fila
aponta para NIL
end
else07/12/2016
25
Implementação: Dequeue Parte 2
begin
new(pAux2); //aloca memória
//aux2 aponta para o inicio da fila
pAux2:=fila;
while(pAux2^.proximo<>fila)do
begin
//aux2 vai para o próximo elemento
da fila
pAux2 := pAux2^.proximo;
end;
new(pAux1); //aloca memória
pAux1 := fila;
//remove o elemento da fila
Dequeue := pAux1^.dado;
//inicio da fila aponta para o próximo
fila := fila^.próximo;
//o próximo de aux2 aponta para o inicio
pAux2^.proximo := fila;
dispose(pAux1); //libera memória
pAux1 := nil; //aux1 aponta para NIL
end;
end;
writeln(' Elemento removido com sucesso! ');
end;
07/12/2016
26
Implementação: Enqueue Parte 1
procedure Enqueue();
begin
write(' Digite um Elemento: ');
readln(x);
if(fila = nil)then
begin
new(fila); //aloca memória
fila^.dado := x; //aloca o novo elemento
fila^.proximo := fila; //aponta para o inicio da fila
end
else
07/12/2016
27
Implementação: Enqueue Parte 2
begin
new(pAux2); //aloca memória
pAux2:=fila; //aux aponta para o inicio da fila
while(pAux2^.proximo<>fila)do
begin
pAux2 := pAux2^.proximo; //vai para o próximo elemento da fila
end;
new(pAux1); //aloca memória
//o próximo elemento de aux1 aponta para inicio da fila
pAux1^.proximo := fila;
pAux1^.dado := x; //aloca o novo elemento
//o próximo elemento de aux2 aponta para aux1
pAux2^.proximo := pAux1;
end;
writeln(' Elemento inserido com sucesso! ');
end;
07/12/2016
28
Implementação: Inicio da Fila
Function Inicio(fila: tipo_fila): integer;
Begin
Inicio := fila^.dado;
end;
07/12/2016
29
Implementação: Impressão da Fila
procedure imprimir();
begin
if(fila = nil)then
begin
writeln('Fila vazia');
end
else
begin
pAux1:=fila;
while(pAux1^.proximo <> fila)do
//imprimindo fila
begin
write(' Elemento : ');
writeln(pAux1^.dado);
pAux1 := pAux1^.proximo;
end; //while
write(' Elemento : ');
writeln(pAux1^.dado);
end; //if
end; //begin07/12/2016
30
Atividade em Sala de Aula
07/12/2016
31
Referências
1. Deitel, H. M.; Deitel, P. J. Java: Como Programar. Tradução: Edson
Furmankiewicz; Revisão Técnica: Fábio Luis Picelli Lucchini. 6.ª Edição. São Paulo:
Pearson Prentice Hall, 2005. Cap. 17, p. 607 – 644.
2. Deitel, H. M.; Deitel, P. J. C: Como Programar. Tradução: Daniel Vieira; Revisão
Técnica: César Caetano. 6.ª Edição. São Paulo: Pearson Prentice Hall, 2011. Cap. 12,
p. 379 – 413.
3. Deitel, H. M.; Deitel, P. J. C++: Como Programar. Tradução: Edson
Furmankiewicz; Revisão Técnica: Fábio Luis Picelli Lucchini. 5.ª Edição. São Paulo:
Pearson Prentice Hall, 2006. Cap. 21, p. 789 – 845.
4. Schildt, H.; Skrien, D. Programação com Java: Uma Introdução Abrangente.
Tradução: Aldir José Coelho Cêrrea da Silva. Revisão Técnica: Maria Lúcia Blanck
Lisbôa. Porto Alegre: AMGH, 2013. Cap. 25, p. 911 – 966
07/12/2016
32
Referências
5. Ziviani, N. Projeto de Algoritmos com Implementações em Pascal e C.
3.ª ed. rev. e amp. São Paulo: Cengage Learning, 2015. Cap. 3, p. 69 – 100.
6. Forouzan, B., Mosharraf, F. Fundamentos da Ciência da Computação.
Tradução: Solange Aparecida Visconti. Revisão Técnica: Ronaldo A. L.
Gonçalves. São Paulo: Cengage Learning, 2011. Cap. 11, p. 257 – 278.
7. Pereira, S. L. Estruturas de Dados Fundamentais: Conceitos e
Aplicações. São Paulo: Érica, 1996.
8. Ascencio, A. F. G.; Araújo, G. S. Estruturas de Dados: Algoritmos,
Análise da Complexidade e Implementações em Java e C/C++. São Paulo:
Pearson Prentice Hall, 2010. Cap. 4, p.183 – 200.
07/12/2016
33

Filas