300 likes | 468 Views
Filas. #define MAXFILA 100 typedef struct queue { int item [ MAXFILA]; int inic, fim; } fila; fila q;. Operações sobre uma fila. q.item. 4. 3. 2. 1. q.inic = 0 q.fim = -1. 0. (a). No momento ( a) a fila está vazia q.inic=o e q.fim = -1
E N D
#define MAXFILA 100 typedef struct queue { int item [ MAXFILA]; int inic, fim; } fila; fila q;
q.item 4 3 2 1 q.inic = 0 q.fim = -1 0 (a)
No momento (a) a fila está vazia • q.inic=o e q.fim = -1 • Quantidade de elementos = q.fim –q.inic+1 • Ou seja: -1-0+1=0
q.item 4 3 q.fim = 2 2 1 0 q.inic = 0 (b)
No momento (b) • No momento (b) houve a inclusão de 3 elementos - 10, 20 e 30 • Quantidade de elementos = q.fim –q.inic+1 • Ou seja: 2 – 0 + 1 = 3
q.item 4 3 q.inic = q.fim =2 2 1 0 (c)
No momento (c) houve a remoção dos elementos 10 e 20 • q.fim = q.inic • 30 é o primeiro e o último elemento • Quantidade de elementos = q.fim –q.inic+1 • Ou seja: 2 – 2 + 1 = 1
q.item q.fim = 4 4 3 q.inic = 2 2 1 0 (d)
No momento (d) existem 4 -2 + 1 =3 • Não é possível inserir outros elementos, pois o elemento 50 ocupa a última posição do vetor • Existem 2 posições livres • Para deslocar os elementos no vetor exige grande esforço computacional X=q.item[0]; For (k=0;k< q.fim; k++) q.item[k]=q.item[k+1]; q.Fim --;
q.item q.fim = 4 4 3 q.inic = 2 2 1 0 (a)
q.item 4 3 q.inic = 2 2 1 0 q.fim = 0 (b)
q.item q.inic = 4 4 3 2 1 0 q.fim = 0 (c)
q.item q.inic = 4 4 3 2 1 q.fim = 1 0 (d)
q.item 4 3 2 1 q.fim = 1 0 q.inic = 0 (e)
Como verificar se a fila está vazia • q.inic é o índice do vetor que é exatamente anterior ao primeiro elemento da fila • q.fim é o índice do último elemento da fila • Se q.inic=q.fim, temos uma fila vazia
q.item q.fim = 4 4 3 q.inic = 1 2 1 0 (a)
q.item 4 3 2 1 q.inic = 1 0 q.fim = 0 (b)
q.item 4 3 2 1 q.inic = q.fim = 1 0 (c)
#define MAXFILA 100 typedef struct queue { int item [ MAXFILA]; int inic, fim; } fila ; Main () fila q;
void inicFila (fila *pq) { pq→inic = MAXFILA -1; pq→fim = MAX FILA -1; }
int filaVazia (fila *pq) { if(pq →inic==pq →fim) return (1) ; /*1 é verdadeiro* / else return (0) ; / *0 é falso*/ ) /* fim filaVazia*/
if (filaVazia (&q)==1) /* tratamento adequado quando a fila está vazia */ else /* tratamento adequado quando a fila não está vazia */
int remFila(fila*pq) { if(filaVazia (pq) ) { printf(“Underflow na fila!\n”); exit ( 1) ; } If (pq → inic = = MAXFILA -1 ) pq → inic = 0; else ( pq →inic) ++; return (pq → item [ pq → inic] ) ; } /*fim remove */
void insFila ( fila *pq, int x) { /*realiza a movimentação para abrir espaço para novo elemento */ if (pq → fim = = MAXFILA – 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 → item [ pq → fim] = x; }