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

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

Filas.

Apresentações semelhantes


Apresentação em tema: "Filas."— Transcrição da apresentação:

1 Filas

2 Filas Outro caso particular de Lista Linear
Conjunto ordenado de itens onde as inclusões só podem ser feitas em uma extremidade (fim da fila) e as remoções só podem ser feitas na outra extremidade (início da fila) Exemplo real clássico: fila de pessoas esperando 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

3 Filas Devido às características das operações da fila, o primeiro elemento inserido será o primeiro a ser retirado A política de inserção e remoção de dados à maneira de uma fila é conhecida como "FIFO" (First In, First Out) Filas são usadas tipicamente quando deseja-se processar itens de acordo com sua ordem de chegada

4 A B C A B C A B C Filas Aplicação em Computação: Fila de Impressão
Exemplo: A B início fim C A B C início fim A B C início fim

5 Filas – Operações Básicas
Seja F uma fila, e e um elemento: insere(F, e): e é inserido no final da fila F retira(F, e): retira o elemento mais antigo da fila F (o elemento que está no início de F) e retorna seu valor através de e vazia(F): indica se a fila está vazia ou não comp(F): retorna o número de elementos na fila F (comprimento da fila)

6 fila A B C A B C A B C Filas - Exemplo insere(fila,A); insere(fila,B);
insere(fila,C); ok=retira(fila,e); A B início fim C A B C início fim A B C início fim

7 Funções Básicas: Fila – Funções Básicas vazia(&fila); inicia(&fila);
retira(&fila, &e); insere(&fila, e); 105

8 Filas 2ª PARTE

9 Filas - Implementações
Diversas formas de implementar, que se distinguem por: natureza dos elementos maneira como elementos são armazenados operações disponíveis Duas formas clássicas: Listas Seqüenciais (Vetor) Lista Encadeada 104

10 Filas em Listas Seqüenciais
Problema: vetor tem tamanho fixo e limitado, enquanto que a fila cresce com a necessidade, sem limite Solução: limitar o tamanho máximo da fila ao tamanho do vetor Problema: impossível remover elemento de uma fila vazia Solução: utilizar a função vazia(F) antes de remover elemento Problema: controlar início e fim da fila Solução: incluir dois campos (ini e fim) para armazenar a posição do início e do fim da fila 105

11 Filas com Vetor #define MAX 100 typedef int tp_item; typedef struct {
tp_item item[MAX]; int ini,fim; } tp_fila; tp_fila fila; 105

12 Filas com Vetor Considerações Iniciais:
fila.fim=-1; /* posição do último elemento */ fila.ini=0; /* posição do primeiro elemento */ Fila Vazia: (fila.fim<fila.ini) Fila Lotada: (fila.fim==MAX-1) No de elementos: (fila.fim-fila.ini+1) Função insere: f.item[++f.fim]=e; Função retira: *e=f.item[f.ini++]; 105

13 Filas com Vetor Problema:
ini e fim avançam à medida em que são feitas inclusões e remoções pode acontecer de a fila ter espaço mas ser considerada lotada (situação 4)!!  A B ini: 0 fim: -1 MAX: 5 ini: 2 fim: 2 MAX: 5 C (1) (3)  A B C  D E ini: 0 fim: 2 MAX: 5 ini: 2 fim: 4 MAX: 5 A B C C D E (2) (4) 105

14 Filas com Vetor Solução 1: modificar retira para deslocar a fila no sentido do início do vetor a cada remoção e eliminar o campo fila.ini  início é sempre no 0 e=f.item[0]; for (i=0; i<fila.fim; i++) fila.item[i]=fila.item[i+1]; Fila vazia: (fila.fim==-1)  A B fim: -1 MAX: 5 fim: 0 MAX: 5 C (1) (3)  A B C  D E fim: 2 MAX: 5 fim: 2 MAX: 5 A B C C D E (2) (4) 105

15 Filas com Vetor Problemas com a Solução 1:
Cada eliminação envolve deslocar todos os elementos restantes da fila  Ineficiência (principalmente para grandes filas) A definição da operação de remoção envolve a manipulação de apenas um elemento e a sua implementação deve refletir este fato, sem envolver operações adicionais 105

16 Filas com Vetor Outra Solução? 105

17 Fila Circular Solução 2: visualizar o vetor que armazena a fila como um círculo  Fila Circular se o último elemento da fila ocupa a última posição do vetor, um novo elemento pode ser inserido no início do vetor  A B ini: 0 fim: -1 MAX: 5 ini: 2 fim: 3 MAX: 5 C D (1) (3)  A B C D  E F G ini: 0 fim: 3 MAX: 5 ini: 2 fim: 1 MAX: 5 A B C D F G C D E (2) (4) 105

18 Fila Circular Outras considerações: int prox (int pos) {
Função para determinar o próximo elemento: int prox (int pos) { if (pos==MAX-1) return 0; else return pos+1; } /* outra opção */ int prox (int pos) { return (pos+1)%MAX; } 105

19 Fila Circular – Fila Vazia
Determinação de Fila Vazia?  não pode mais ser feita por (fila.fim<fila.ini) ini: 0 fim: -1 MAX: 5 ini: 2 fim: 1 MAX: 5 F G C D E (1) (4) 105

20 Fila Circular – Fila Vazia
Problema com a Fila Circular: determinação de Fila Vazia não pode mais ser feita com (fila.fim<fila.ini) Solução: considerar que fila.ini é a posição anterior ao primeiro elemento da fila Para verificar se a fila está vazia: (fila.ini==fila.fim) Para inicializar  início e fim com última posição: fila.ini = fila.fim = MAX-1; (precede posição 0) 105

21 Fila Circular – Fila Vazia
Determinação de Fila Cheia? F G H I E ini: 3 fim: 3 MAX: 5 (4)  E F G H I Como distinguir Fila Cheia de Fila Vazia? Ambas são: (fila.ini==fila.fim) Solução! (fila.ini==fila.fim)  A B C D ini: 4 fim: 4 MAX: 5 ini: 3 fim: 3 MAX: 5 (1) (3)  A B C D  E F G H ini: 4 fim: 3 MAX: 5 ini: 3 fim: 2 MAX: 5 A B C D F G H E (2) (4) 105

22 Fila Circular – Fila Cheia
Problema: Determinação de Fila Cheia  Situação idêntica à da Fila Vazia Solução: “sacrificar” uma posição do vetor, permitindo incluir apenas MAX-1 elementos há sempre uma posição vazia para marcar início/fim da fila Teste de Fila Cheia: prox(fila.fim)==fila.ini 105

23 Fila Circular – Fila Cheia
Fila Vazia (fila.ini==fila.fim)  A B C D ini: 4 fim: 4 MAX: 5 ini: 3 fim: 3 MAX: 5 (1) (3)  A B C D  E F G H ini: 4 fim: 3 MAX: 5 ini: 3 fim: 2 MAX: 5 A B C D F G H E (2) (4) Fila Cheia (prox(fila.fim)==fila.ini) 105

24 Fila Circular – Fila Cheia
Outra Solução: Adicionar um novo campo (tam) na estrutura para armazenar o número de elementos na fila Fila Vazia: (fila.tam==0) Fila Cheia: (fila.tam==MAX-1) Solução não adotada pela maioria dos autores e programadores 105

25 Funções Básicas: Fila Circular vazia(&fila); inicia(&fila);
retira(&fila, &e); insere(&fila, e); 105

26 Fila Circular Função vazia(&fila): int vazia(tp_fila *f) {
if (f->ini == f->fim) return 1; else return 0; } /* outra opção */ return (f->ini==f->fim); Função inicia(&fila): void inicia (tp_fila *f) { f->ini=f->fim=MAX-1; } 105

27 Fila Circular int retira(tp_fila *f, tp_item *e) { if (vazia(f))
return 0; else { f->ini=prox(f->ini); *e=f->item[f->ini]; return 1; } 105

28 Fila Circular int insere(tp_fila *f, tp_item e) {
if (prox(f->fim)==f->ini) return 0; else { f->fim=prox(f->fim); f->item[f->fim] = e; return 1; } 105

29 Fila Circular ? Como percorrer a Fila? 105

30 Fila Circular Para percorrer: /*outra forma */ i=fila.ini;
while (i!=fila.fim) { i=prox(i); printf("%d\t",fila.item[i]); } printf("\n"); Para percorrer: if (!vazia(&fila)) { i=fila.ini; do { i=prox(i); printf("%d\t",fila.item[i]); } while (i!=fila.fim); printf("\n"); } 105


Carregar ppt "Filas."

Apresentações semelhantes


Anúncios Google