1 / 18

Filas

Filas. Marco Antonio Montebello Júnior marco.antonio@aes.edu.br. Estrutura de Dados. Listas Lineares. Listas Lineares. Fila Dupla. Fila. Pilha. Saída restrita. Entrada restrita. Fila versus Pilha. SAÍDA. SAÍDA. ENTRADA. FIM. Elemento 2. TOPO. Elemento 2. Elemento 2.

gili
Download Presentation

Filas

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Filas Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Estrutura de Dados

  2. Listas Lineares Listas Lineares Fila Dupla Fila Pilha Saída restrita Entrada restrita Estrutura de Dados

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

  4. Filas • Operações primitivas que manipulam as filas: Estrutura de Dados

  5. 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; Estrutura de Dados

  6. 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 Estrutura de Dados

  7. Filas – Problema Clássico • Problema clássico da fila vazia sem possibilidade de inserir novos elementos: Estrutura de Dados

  8. 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, 10.000, 1.000.000 elementos • Esta solução escolhida parece ser bastante ineficiente Estrutura de Dados

  9. 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. Estrutura de Dados

  10. 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 Estrutura de Dados

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

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

  13. Filas CircularesFila Vazia intFilaVazia(struct queue *pq) { if(pqinic == pqfim) return(1); //Verdadeiro(V) else return(0); //False(F) } Estrutura de Dados

  14. Filas CircularesRetirar 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]); } Estrutura de Dados

  15. Filas CircularesInserir 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 Estrutura de Dados

  16. Filas CircularesInserir 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; } Estrutura de Dados

  17. Filas CircularesInserir Elementos Estrutura de Dados

  18. 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 Estrutura de Dados

More Related