Carregar apresentação
A apresentação está carregando. Por favor, espere
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
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.