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
0
q.fim = -1
(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
2
1
0
30
q.fim = 2
20
10
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
2
30
q.inic = q.fim =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
50
q.fim = 4
4
3
2
40
30
q.inic = 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 --;

Fila circular
q.item
50
q.fim = 4
4
40
3
30
q.inic = 2
2
1
0
(a)
q.item
50
4
40
3
2
30
q.inic = 2
1
0
60
q.fim = 0
(b)
q.item
50
q.inic = 4
4
3
2
1
0
60
q.fim = 0
(c)
q.item
50
q.inic = 4
70
q.fim = 1
4
3
2
1
0
60
(d)
q.item
4
3
2
1
0
70
q.fim = 1
60
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
Ilustração da
operação da inserção
na fila
q.item
50
q.fim = 4
4
40
3
30
q.inic = 1
2
1
0
(a)
q.item
50
4
40
3
2
30
1
q.inic = 1
0
60
q.fim = 0
(b)
q.item
50
4
40
3
2
30
1
70
0
q.inic = q.fim = 1
60
(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;
}
Download

Filas