190 likes | 372 Vues
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.
E N D
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 Estrutura de Dados
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
Filas • Operações primitivas que manipulam as filas: 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; 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 Estrutura de Dados
Filas – Problema Clássico • Problema clássico da fila vazia sem possibilidade de inserir novos elementos: 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, 10.000, 1.000.000 elementos • Esta solução escolhida parece ser bastante ineficiente 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. 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 Estrutura de Dados
Filas CircularesDeclaração da Fila #define MAXQUEUE 100 struct queue { int item [MAXQUEUE]; int inic, fim; }; struct queue q; Estrutura de Dados
Filas CircularesInicialização da Fila void InicializaFila(struct queue *pq) { pqinic = MAXQUEUE – 1; pqfim = MAXQUEUE – 1; } Estrutura de Dados
Filas CircularesFila Vazia intFilaVazia(struct queue *pq) { if(pqinic == pqfim) return(1); //Verdadeiro(V) else return(0); //False(F) } Estrutura de Dados
Filas CircularesRetirar Elementos int RemoveFila (struct queue *pq) { if(FilaVazia(pq)) { printf(“Underflow na fila!\n”); exit(1); } if(pqinic == MAXQUEUE – 1) pqinic = 0; else (pqinic)++; return(pqitems[pqinic]); } Estrutura de Dados
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
Filas CircularesInserir Elementos void InsereFila(struct queue *pq, int x) { if(pqfim == MAXQUEUE – 1) pqfim = 0; else (pqfim )++; //Verifica ocorrência de estouro if(pqfim == pqinic) { printf(“Ocorreu overflow na fila!\n”); exit(1); } pqitems[pqfim] = x; return; } Estrutura de Dados
Filas CircularesInserir Elementos Estrutura de Dados
InsereFila versus RemoveFila • Teste de overflow em InsereFila(): • Ocorre somente depois que pqfim é incrementado em uma unidade • 1o. Incrementa depois verifica • Teste de underflow em RemoveFila(): • Ocorre assim que a rotina é chamada, só então pqinic é incrementado em uma unidade • 1o. Verifica depois incrementa Estrutura de Dados