A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

ESTRUTURAS DO TIPO FILA

Apresentações semelhantes


Apresentação em tema: "ESTRUTURAS DO TIPO FILA"— Transcrição da apresentação:

1 ESTRUTURAS DO TIPO FILA

2 Filas Uma fila é também uma lista linear, mas para esta estrutura as inserções só podem ser efetuadas em um extremo da lista, e todas as retiradas (e geralmente os acessos) são realizados no outro extremo da lista. Política FIFO: first in first out Modelo real clássico: fila de pessoas esperando o atendimento em um banco: as pessoas do início da fila são atendidas antes e as que chegam depois, entram no fim da fila Ordem das filas: Ordem de chegada

3 Filas Filas são usadas tipicamente quando deseja-se processar itens de acordo com sua ordem de chegada (FIFO): Ex: filas do SO, simuladores, etc... As operações básicas definidas sobre um TAD Fila seriam semelhantes às operações definidas anteriormente para as pilhas e listas lineares

4 Operações definidas sobre o TAD Fila
Inicia(Fila): faz a inicialização da fila Esvazia(Fila): Faz a fila ficar vazia Vazia(Fila): Função que retorna TRUE se a fila está vazia e FALSE do contrário; Enfileirar(x,Fila): Insere o elemento x no fim da Fila; Desenfileirar(Fila, x): Retorna elemento x no início da Fila, eliminando-o da mesma; Imprimir(Fila): imprime todos os elementos da fila

5 FILAS COM IMPLEMENTAÇÃO ATRAVÉS DE VETORES

6 Tipos de Representação
Tradicional Em forma de Pilha x1 elementos ... x2 xn Frente = 1 Retaguarda MaxTam 2 x1 elementos Frente = 1 x2 ... xn Retaguarda MaxTam 2

7 Implementação da Estrutura da Fila
const MaxTam = 100; InicioVetor = 1; type Ponteiro = integer; TipoItem = record Chave: TipoChave;     {outras declarações desejadas...}      end; TipoFila = record Item: array [1..MaxTam] of TipoItem;               Frente: Ponteiro; Retaguarda: Ponteiro;              end;

8 Operações sobre Filas usando Arranjo
procedure Inicia(var Fila: TipoFila); begin Fila.Frente := InicioVetor; Fila.Retaguarda := Fila.Frente; end; procedure Esvazia(var Fila: TipoFila); function Vazia(var Fila: TipoFila): boolean; Vazia := Fila.Frente = Fila.Retaguarda;

9 Operações sobre Filas usando Arranjo
procedure Imprimir (var Fila: TipoFila); var indice : Ponteiro; begin indice := Fila.Frente + 1; while indice <= Fila.Retaguarda do writeln(Fila.Item[indice].Chave); indice := indice +1; end end;

10 Implementação de Filas com Arranjos
Procedimentos de Enfileirar e Desenfileirar: Quando um elemento é enfileirado, a parte final da fila é esticada... Quando um elemento é retirado da fila, a parte frontal da fila é contraída...

11 Operações sobre Filas usando Arranjo
procedure Enfileira (x:TipoItem; var Fila:TipoFila); var indice : Ponteiro; begin if Fila.Retaguarda = MaxTam + 1 then writeln (‘Overflow’) else begin Fila.Item[Fila.Retaguarda] := x; Fila.Retaguarda := Fila.Retaguarda + 1; end; procedure Desenfileira (var Fila:TipoFila; x:TipoItem); if Vazia(Fila) then writeln (‘Fila Vazia’) x := Fila.Item[Fila.Frente]; Fila.Frente := Fila.Frente + 1;

12 Implementação de Filas com Arranjos
Inserir os elementos 9, 6, 1, 10, 5, 8, e em seguida, exclui-los, na ordem informada 9 6 1 10 5 8 F R F R F R F R F R F R F R A fila está vazia mas não é mais possível inserir elementos

13 Problemas com Filas Na seqüência anterior, a fila chega ao limite final do espaço de memória Se tentarmos inserir um novo elemento, o TAD vai nos retornar um erro, dando a falsa impressão de que não existe mais espaço disponível... Solução: No algoritmo de inserção, após a atualização de Frente, verificar se a fila ficou vazia, i.e, Frente = Retaguarda; se este for o caso, reinicializar (Frente = Retaguarda := InicioVetor;) 3 4 9 6 1 10 5 8 F R

14 Problemas com Filas Mesmo assim ainda não resolve completamente o problema Em um vetor de 5 posições, as operações IIEIEIEIEI vai causar overflow, mesmo com a lista quase vazia F R Overflow!!! 9 6 1 10 5 8 7 Solução: Forçar Retaguarda a usar o espaço liberado por Começo, formando uma Fila Circular

15 Implementação de Filas com Arranjos
Mesmo assim ainda não resolve completamente o problema No exemplo dado, realize as seguintes operações: I9, I6, E, I1, E, I10, E, I5, E, I8, E, I7 7 9 6 1 10 5 8 Overflow!!! F R F R F R F R F R F R R Solução: Forçar Retaguarda a usar o espaço liberado por Começo, formando uma Fila Circular

16 Filas Circulares Frente
Mesma estrutura, inclusive com os ponteiros de controle frente e retaguarda Inicialmente também Frente = Retaguarda = InicioVetor Na fila circular, uma posição do vetor é utilizada para marcar o fim da fila no círculo: Perde-se uma posição, mas ganha-se em agilidade Mesmas operações utilizadas em fila comum, mas com alterações em Enfileira, e Desenfileira e Imprimir Retaguarda

17 Operações sobre Filas usando Arranjo
procedure Enfileirar (x:TipoItem; var Fila:TipoFila); begin if Fila.Frente = (Fila.Retaguarda mod MaxTam ) + 1 then writeln(‘Overflow’) else begin Fila.Item[Fila.Retaguarda] := x; Fila.Retaguarda := (Fila.Retaguarda mod MaxTam ) + 1; end; procedure Desenfileirar (var Fila:TipoFila; var x:TipoItem); if Vazia(Fila) then writeln(‘Underflow’) x := Fila.Item[Fila.Frente]; Fila.Frente := (Fila.Frente mod MaxTam) + 1;

18 Operações sobre Filas usando Arranjo
procedure Imprimir (var Fila: TipoFila); var indice : Ponteiro; begin indice := Fila.Frente; while indice <> Fila.Retaguarda do writeln(Fila.Item[indice].Chave); indice := (indice mod MaxTam)+1; end writeln(Fila.Item[Fila.Retaguarda].Chave); end;


Carregar ppt "ESTRUTURAS DO TIPO FILA"

Apresentações semelhantes


Anúncios Google