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

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

Filas Marco Antonio Montebello Júnior Estrutura de Dados.

Apresentações semelhantes


Apresentação em tema: "Filas Marco Antonio Montebello Júnior Estrutura de Dados."— Transcrição da apresentação:

1 Filas Marco Antonio Montebello Júnior Estrutura de Dados

2 Listas Lineares Pilha Fila Fila Dupla Entrada restrita Saída restrita

3 Estrutura de Dados Fila versus Pilha BASE TOPO SAÍDAENTRADA Elemento 1 Elemento 2 SAÍDA Elemento 1 Elemento 2 ENTRADA INÍCIO FIM

4 Estrutura de Dados Filas Operações primitivas que manipulam as filas: InicializaFila (q) ou init(q)Faz a fila q ficar vazia FilaVazia(q) ou empty(q)Retorna V se a fila q está vazia FilaCheia(q) ou full(q)Retorna V se a fila q está cheia InsereFila(q,x) ou insert(q,x)Insere o elemento x no final da fila q RemoveFila(q) ou remove(q) Remove o PRIMEIRO elemento da fila, retornando o conteúdo do elemento como valor da função

5 Estrutura de Dados Filas Representando filas em Linguagem C: Podemos utilizar vetor Apoio de 2 variáveis: inic e fim inic – Primeiro elemento da fila fim – Último elemento da fila #define MAXQUEUE 100 struct queue { int item[MAXQUEUE]; int inic, fim; }; struct queue q;

6 Estrutura de Dados Filas Ignorando momentaneamente a possibilidade de overflow e underflow: Operação InsereFila(q, x): q.item [++ q.fim] = x Operação RemoveFila(q): x = q.item [q.inic ++]; No momento que a fila é criada, q.fim é definido como –1 e q.inic como 0 A fila está vazia sempre que q.fim < q.inic Número de elementos na fila é sempre igual ao valor de q.fim - q.inic + 1

7 Estrutura de Dados Filas – Problema Clássico Problema clássico da fila vazia sem possibilidade de inserir novos elementos: q.item 4Eq.fim =4 3D 2Cq.fim=2Cq.inic= q.fim=2 Cq.inic =2 1B 0q.inic = 0 q.fim = -1 Aq.inic=0

8 Estrutura de Dados Filas – Solução 1 Remanejar todos os elementos quando remover um elemento: RemoveFila(q); x = q.item [ 0 ]; for (i = 0; i < q.fim; i++) q.item[ i ] = q.item[ i + 1 ]; q.fim --; O campo q.inic não é necessário porque o elemento na posição 0 do vetor está sempre no início da fila. A fila vazia é representada por q.fim igual a –1 Podemos verificar que pode existir um grande esforço computacional para a movimentação de 500, 1000, , elementos Esta solução escolhida parece ser bastante ineficiente

9 Estrutura de Dados Filas Circulares Solução mais elegante para resolver problema das filas. A idéia é armazenar os elementos na fila como um círculo. Primeiro elemento do vetor vem logo depois do último. Se o último elemento estiver ocupado, um novo valor pode ser inserido no primeiro elemento do vetor. Elemento novo não será incluído numa fila circular somente se não houver de fato espaço na mesma.

10 Estrutura de Dados Filas Circulares No momento (4), q.fim < q.inic (1 < 4), é verdadeira – fila vazia? Solução: q.inic deve apontar para o elemento anterior ao primeiro. Assim, a condição para a fila estar vazia passa a ser q.fim = q.inic q.item q.Itemq.item 4Eq.fim=4EEq.inic=4E 3DD 2Cf.inic=2Cq.inic=2 1q.fim=0Gq.fim=1G 0FFq.fim=0FFq.inic=0

11 Estrutura de Dados Filas Circulares Declaração da Fila #define MAXQUEUE 100 struct queue { int item [MAXQUEUE]; int inic, fim; }; struct queue q;

12 Estrutura de Dados Filas Circulares Inicialização da Fila void InicializaFila(struct queue *pq) { pq inic = MAXQUEUE – 1; pq fim = MAXQUEUE – 1; }

13 Estrutura de Dados Filas Circulares Fila Vazia int FilaVazia(struct queue *pq) { if(pq inic == pq fim) return(1); //Verdadeiro(V) else return(0); //False(F) }

14 Estrutura de Dados Filas Circulares Retirar Elementos int RemoveFila (struct queue *pq) { if(FilaVazia(pq)) { printf(Underflow na fila!\n); exit(1); } if(pq inic == MAXQUEUE – 1) pq inic = 0; else (pq inic)++; return(pq items[pq inic]); }

15 Estrutura de Dados Filas Circulares Inserir Elementos Problema para testar se a fila está cheia. Solução: sacrificar um elemento da fila. Se o vetor da fila tiver 100 elementos, poderá armazenar 99 elementos A tentativa de inserir o centésimo elemento irá gerar o estouro da fila

16 Estrutura de Dados Filas Circulares Inserir Elementos void InsereFila(struct queue *pq, int x) { if(pq fim == MAXQUEUE – 1) pq fim = 0; else (pq fim )++; //Verifica ocorrência de estouro if(pq fim == pq inic) { printf(Ocorreu overflow na fila!\n); exit(1); } pq items[pq fim] = x; return; }

17 Estrutura de Dados Filas Circulares Inserir Elementos q.item 4Eq.fim=4EE 3DDD 2CCC 1q.inic=1 G q.Inic = q.fim = 1 0Fq.fim=0F

18 Estrutura de Dados InsereFila versus RemoveFila Teste de overflow em InsereFila(): Ocorre somente depois que pq fim é incrementado em uma unidade 1o. Incrementa depois verifica Teste de underflow em RemoveFila(): Ocorre assim que a rotina é chamada, só então pq inic é incrementado em uma unidade 1o. Verifica depois incrementa


Carregar ppt "Filas Marco Antonio Montebello Júnior Estrutura de Dados."

Apresentações semelhantes


Anúncios Google