16_filas_em_estrutura_de_dados.pdf

download 16_filas_em_estrutura_de_dados.pdf

of 8

Transcript of 16_filas_em_estrutura_de_dados.pdf

  • 8/17/2019 16_filas_em_estrutura_de_dados.pdf

    1/8

    Filas Professor Sérgio Furgeri

    Página 1

    Filas

    Fila é um tipo de lista linear onde as inserções são realizadas num extremo (final da Fila) eas remoções restritas ao outro (começo da Fila).

    O primeiro a entrar é o primeiro a sair e último a entrar é também o último a sair (FIFO -First-In/First-Out).

    A ordem de saída corresponde diretamente à ordem de entrada dos elementos.

    Exemplo Físico:

    Patindo da palavra ingles queue que significa fila, são denominadas duas operações básicassuportadas pelas Filas:

    •  Enqueue: insere um elemento no final da Fila.

    • 

    Dequeue: remove um elemento do começo da Fila.

    Exemplo de Instruções

    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 começo da Fila.

    Exemplo do uso das instruções da Fila (representação gráfica)

    Operação Estado da Fila Resultado

    ----------------- F:[ ] ---------------Enqueue(F, a) F:[ a ] ---------------Enqueue(F, b) F:[ a, b ] ---------------Enqueue(F, c) F:[ a, b, c ] ---------------Enqueue(F, d) F:[ a, b, c, d ] ---------------Dequeue(F) F:[ b, c, d ] aDequeue(F) F:[ c, d ] bEnqueue(F, e) F:[ c, d, e ] ---------------

    Fila de caixa bancário

  • 8/17/2019 16_filas_em_estrutura_de_dados.pdf

    2/8

    Filas Professor Sérgio Furgeri

    Página 2

    Enqueue(F, f) F:[ c, d, e, f ] ---------------Enqueue(F, Dequeue (F)) F:[ d, e, f ] c

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

    Dequeue(F) F:[ e, f , c ] dDequeue(F) F:[ f , c ] eDequeue(F) P:[ c ] f

    Representação gráfica de Filas

    Implementação de Filas em Pascal

    A implementação das Filas é viável quanto temos três recursos básicos:

    →  Espaço de memória para armazenar os elementos;

    →  Uma referência ao primeiro elemento da coleção;

    →  Uma referência à primeira posição livre, após o último elemento da fila.

    De acordo com as características da Fila, poderemos usar:

    • 

    um vetor para alocar o espaço de memória seqüêncial.•  duas variáveis inteiras para referenciar o primeiro elemento e a primeira

     posição disponível no final da fila.

    Para ser criada uma Fila pode ser usada a estrutura RECORD:

    const MAX = 50;

    type  Elem = char;

    Fila = record  

    começo: integer;

    final : integer;

    memo : array[1..MAX] of Elem;end;

    var F: Fila; 

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

    a b c d ...F:

    come o final

  • 8/17/2019 16_filas_em_estrutura_de_dados.pdf

    3/8

    Filas Professor Sérgio Furgeri

    Página 3

    -  Inicializar a fila, indicando que está vazia;-  À medida que elementos são inseridos, o índice F.final  se desloca para direita,

    acontecendo da mesma forma para o índice F.comeco, que indicará a próxima posição disponível.

    -  O índice F.comeco irá sempre “perseguir” F.final, até quando a fila não conter maisnenhum elemento, pois teremos F.comeco igual a F.final. A seguir a representação

    de esvaziamento da fila:

    Algoritmo para Manipulação da Fila:

    a) 

    Inicialização da Fila

     procedure Qinit(var F: Fila);

     begin

    F.comeco:= 1;

    F.final:= 1;end;

    Considerações:•  Indicar o valor 1 a F.comeco e F.final deixando-os iguais e também mostrando

    que a fila está vazia e a primeira posição do vetor F.memo está disponível parainserção.

    •  Inicia com valor 1 pois o vetor vai de 1..MAX, não podendo haver valor na posição 0.

     b)  Limites da Fila

    F.comecoF.finalF.memo

    F: 1 4 a b c ...

    1 2 3 4 ... max

    Fila no seu estado inicial

    F: 1 4 a b c ...

    1 2 3 ... max

    Removendo o elemento a

    F: 2 4 a b c ...

    1 2 3 ... max

    Removendo o elemento c

    F: 4 4 a b c ...

    1 2 3 ... max

    Removendo o elemento b

    F: 3 4 a b c ...

    1 2 3 ... max

  • 8/17/2019 16_filas_em_estrutura_de_dados.pdf

    4/8

    Filas Professor Sérgio Furgeri

    Página 4

    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;

    Considerações:•  Por que usar função no lugar de procedimento?•  Quando a Fila está vazia?•  Quando a Fila está cheia?•  A passagem por referência é dada, mas não obrigatória, uma vez que não

    existe a necessidade de se alterar o valor da Fila. Entretanto, não é necessário criaruma nova variável para copiar a pilha na memória (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; 

    Considerações:•  Há espaço para uma nova inserção? Se não, 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; 

    Considerações:

  • 8/17/2019 16_filas_em_estrutura_de_dados.pdf

    5/8

    Filas Professor Sérgio Furgeri

    Página 5

    •  A Fila está vazia?•  Remover sempre do começo da Fila.•  Retorna o elemento decrementado do começo da Fila.

    • 

    Se tentar remover um elemento da Fila vazia, mensagem “Queue Underflow”.

    Problemas na Inplementação Seqüencial de Filas

    Exemplo:- 

    uma determinada fila com capacidade de armazenamento de 5 elementos (max = 5).

    -  Sempre que um elemento é removido, o índice que indica o começo desloca-se paraa direita.

    -  Se inicialmente ele vale 1, após todos os elementos derem sido removidos da Fila asituação será:

    -  Onde: a função QisFull( )  indica que não há espaço livre (F.final > max)  se forinserir um elemento e a função QisEmpty dirá que a fila está vazia (F.comeco =F.final) se tentarmos remover um elemento.

    Deperdício de memória e Problemas de lógica.

    Solucionando Problemas de Implementação Seqüencial

    Acrescentar uma variável que sirva de contador para saber quanto elementoscontém a Fila.

    -  Inicialmente a variável deve ser zerada.-  Deve ser atualização sempre que for adicionado ou removido algum elemento.

    F: 1 6 a b c d e

    1 2 3 4 5

    Representação de um fila cheia

    F: 1 6 a b c d e

    1 2 3 4 5

    Representação de um fila: está cheia ou vazia?

    1 2 3 4 5

    F: 3 2 5 a b c d

  • 8/17/2019 16_filas_em_estrutura_de_dados.pdf

    6/8

    Filas Professor Sérgio Furgeri

    Página 6

    -  O desperdício de espaço pode ser sanado com uma posição prontamente disponível,ou seja, a posição 1 estar localizada imediatamente após a posiçao max, indicandoque a fila está cheia e não há espaço livre conforme a representação abaixo:

    -  Alocando a área de memória conforme a figura acima, um índice i com valormax+1 apontaria primeira posição, com valor max+2 apontaria a segunda posição eassim por diante, porém as células de memória são dispostas de forma linear e nãoem círculo.

    -  Para isso, é necessário que sempre que for incrementado e seu valor ultrapassar aconstante max, seu valor será definido com 1.

     procedure adc(var i:integer);

     begin

    i:= i+1;

    if i>max then i:= 1;end; 

    Implementação Circular para Filas

    Obs:-   Note que a rotina adc, não estará disponível aos usuários em Filas.tpu, pois não está

    declarada na seção interface sendo assim exclusivamente de uso restrito da unidade.

    -  Serão usadas para incremento e decremento as rotinas predefinidas pela linguagemPascal, 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;

    a

     b

    c

    de

    1

    2

    3

    45

    6

    ...

    max começo

    final

    Representação circular de uma fila

  • 8/17/2019 16_filas_em_estrutura_de_dados.pdf

    7/8

    Filas Professor Sérgio Furgeri

    Página 7

     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.

  • 8/17/2019 16_filas_em_estrutura_de_dados.pdf

    8/8

    Filas Professor Sérgio Furgeri

    Página 8

    Exercícios

    1. 

    Mostre a situação de uma fila F, inicialmente vazia. Após a execução de cada uma

    das seguintes operações:Enqueue(F, a); Enqueue(F, b); Enqueue(F, c);Enqueue(F, d); Dequeue(F); Dequeue(F);Enqueue(F, e); Dequeue(F); Enqueue(F, f);Dequeue(F); Enqueue(F, g); Enqueue(F, Dequeue(F));

    2.  O impasse filavazia/cheia, na implementação circular, foi solucionado com o uso deuma variável contadora. Uma outra forma de resolver o problema seria impedir queo índice final alcançasse o índice começo, deixando sempre pelo menos uma posição livre entre o primeiro e o último elemento da fila. Apresente uma nova

    implementação circular para o tipo Fila que se baseie neste princípio para detectarfila vazia/cheia.

    3. 

    Vimos que uma fila dupla é uma lista linear na qual os elementos podem serinseridos ou removidos de qualquer extremo. Baseando-se na implementaçãocircular apresentada para filas, codifique uma unidade de rotinas para manipulaçaode filas duplas. A unidade deve conter rotinas para inicializar, testar fila vazia/cheia,inserir à esquerda, inserir à direita, remover à esquerda e também à direita.

    4.  Dependendo do conjunto de operações que decidimos aplicar sobre uma variável dotipo fila dupla, ela poderá se comportar como uma pilha ou então como uma fila.Isto seria vantajoso numa aplicação que precisasse usar tanto pilhas quanto filas, pois bastaria ter uma implementação de fila dupla. Mostre como uma fila dupla pode funcionar como:a)  uma pilha b)  uma fila

    5.  É possível que uma única fila dupla seja utilizada para representar duas pilhasdistintas. Admitindo que a implementação solicitada no exercício 3 estejadisponível, utilize as operações de fila dupla para desenvolver rotinas parainicializar, inserir e remover objetos destas pilhas.

    6.  Seria possível utilizar uma fila dupla para representar duas filas simples?

    7. 

    Considerando que você tem a disposição duas pilhas. Mostre como elas podem serutilizadas em conjunto para simular o funcionamento de uma fila. [Dica: utilize uma pilha como espaço de armazenamento e a outra como espaço auxiliar paraoperações de movimentação de dados].