Filas
#define MAXFILA 100typedef struct queue {
int item [ MAXFILA];int inic, fim;
} fila;
fila q;
Operações sobre uma fila.
q.item
4
3
2
1
0
(a)
q.inic = 0
q.fim = -1
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
30
20
10
q.item
q.fim = 2
q.inic = 0
(b)
4
3
2
1
0
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
30
q.item
q.inic = q.fim =2
(c)
4
3
2
1
0
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
50
40
30
q.item
(d)
q.fim = 4
q.inic = 2
4
3
2
1
0
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 --;
Fila circular
50
40
30
q.item
4
3
2
1
0
(a)
q.fim = 4
q.inic = 2
50
40
30
60
q.item
(b)
q.inic = 2
q.fim = 0
4
3
2
1
0
50
60
q.item
(c)
q.inic = 4
q.fim = 0
4
3
2
1
0
50
70
60
q.item
(d)
q.inic = 4
q.fim = 1
4
3
2
1
0
70
60
q.item
(e)
q.inic = 0
q.fim = 1
4
3
2
1
0
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
Ilustração da operação da inserção
na fila
50
40
30
q.item
4
3
2
1
0
(a)
q.inic = 1
q.fim = 4
50
40
30
60
q.item
(b)
q.inic = 1
q.fim = 0
4
3
2
1
0
50
40
30
70
60
q.item
(c)
q.inic = q.fim = 1
4
3
2
1
0
#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;
}