You are on page 1of 19

Fila

Fila

Uma fila um conjunto ordenado de itens a partir do qual podem-se eliminar itens numa extremidade (chamada incio da fila) e no qual podem-se inserir itens na outra extremidade (chamada final da fila).

Fila
O exemplo ilustra uma fila contendo trs elementos, A, B e C. A o incio da fila e C o final. Em b, foi eliminado um elemento da fila. Como os elementos s podem ser eliminados a partir do incio da fila, A removido e B passa a ocupar o incio da fila. Em c, quando os itens D e E forem inseridos, essa operao dever ocorrer no final da fila.

Como D foi inserido na fila antes de E, ele ser removido em primeiro lugar. O primeiro elemento inserido numa fila o primeiro a ser removido. Por essa razo, uma fila usa a poltica de insero e remoo chamada de fifo (first-in, firstout - o primeiro que entra o primeiro a sair)

Operaes Primitivas
Existem cinco operaes primitivas que podem ser aplicadas a uma fila. A operao insere (q,x) insere o item x na fila q. A operao x = retira(q) elimina o elemento da fila q e define x com seu contedo. A terceira operao, vazia(q), retorna verdadeiro, se a fila estiver vazia. A quarta operao, cheia(q) retorna verdadeiro se a fila q estiver cheia. A quinta operao inicializa(q), cria um fila vazia.

Fila - Implementao
Uma fila em C pode, por conseguinte, ser declarada como uma estrutura contendo trs objetos: um vetor para armazenar os elementos da fila, um inteiro para indicar o incio da fila e um inteiro para indicar o fim da fila no vetor. Para uma fila de inteiros, isso pode ser feito pelas seguintes declaraes: #define tamanho 100 struct fila { int inicio, fim; int item[tamanho]; }; Assim que isso for feito, uma fila q poder ser declarada por: struct fila q;

Fila - Implementao
#define tamanho 100 struct fila { int inicio, fim; int item[tamanho]; };

Nesse caso, presumimos que os elementos da fila q, contida no vetor q.item, so inteiros e que a fila no conter, em momento algum, mais do que os inteiros de tamanho. Neste exemplo, tamanho est definido em 100, indicando que a fila poder conter 100 elementos (item[0] a item[99]).

Fila - Implementao
#define tamanho 100 struct fila { int inicio,fim; int item[tamanho]; };

struct fila q;

Se uma fila contiver um s item e ele for retirado, a fila resultante no conter itens e ser chamada de fila vazia. A operao retira no pode ser aplicada fila vazia porque essa fila no tem elementos para ser retirado. Portanto, antes de aplicar o operador retira a uma fila, precisamos verificar se ela no est vazia.

Fila - Implementao
#define tamanho 100 struct fila { int inicio,fim; int item[tamanho]; };

struct fila q;

A fila vazia no contm elementos e poder ser, portanto, indicada por inicialmente q.fim igual a -1, e q.inicio igual com 0. A fila est vazia sempre que q.fim < q.inicio. O nmero de elementos na fila, a qualquer momento, igual ao valor de q.fim - q.inicio + 1

if (q.fim < q.inicio) // a fila est vazia else // a fila no est vazia

Fila - Implementao
#define tamanho 100 struct fila { int inicio, fim; int item[tamanho]; };

struct fila q;

Se o ponteiro fim estiver na posio 99, a fila resultante estar cheia e no poder receber mais itens e ser chamada de fila cheia. Portanto, antes de aplicar o operador insere a uma fila, precisamos verificar se ela no est cheia.

Fila - Implementao
#define tamanho 100 struct fila { int inicio,fim; int item[tamanho]; };

struct fila q;

No decorrer da execuo, para determinar se uma fila est cheia ou no, o critrio q.fim == tamanho - 1 deve ser verificado numa instruo if, como segue: if (q.fim == tamanho - 1) // a fila est cheia else // a fila no est cheia

Fila Implementao da funo vazia


struct fila q
#define tamanho 100 struct fila { int inicio,fim; int item[tamanho]; }; inicio

pq

fim

item[100]

struct fila q;

int filaVazia(struct fila *pq) { if (pq->fim < pq->inicio) return(1); else return(0) ; }
onde pq contm o endereo da varivel q, ou seja, pq = &q;

Para acessar os membros da estrutura, usamos pq->inicio pq->fim pq->item[0]

Fila Implementao da funo cheia


#define tamanho 100 struct fila { int inicio,fim; int item[tamanho]; };

struct fila q;

int filaCheia(struct fila *pq) { if (pq->fim == tamanho - 1) return(1); else return(0) ; }

Fila Implementao da funo cheia


#define tamanho 100 struct fila { int inicio,fim; int item[tamanho]; };

struct fila q;

int filaInicializa(struct fila *pq) { pq->inicio=0; pq->fim= -1; }

Fila Implementao da funo insere


#define tamanho 100 struct fila { int inicio,fim; int item[tamanho]; }; struct fila q; void filaInsere(struct fila *pq, int x) { if (filaCheia(pq)) printf(fila cheia"); else pq->item [++(pq->fim)] = x; } #define tamanho 100 struct fila { int inicio,fim; int item[tamanho]; }; struct fila q; void filaInsere(struct fila *pq, int x) { if (filaCheia(pq)) printf(fila cheia"); else { pq->fim=pq->fim+1; pq->item[pq->fim] = x; } }

No programa principal chamamos a funo insere da seguinte forma: filaInsere(&q, x);

Fila Implementao da funo retira


#define tamanho 100 struct fila { int inicio,fim; int item[tamanho]; }; struct fila q; int filaRetira(struct fila *pq) { if (filaVazia(pq)) { printf(fila vazia"); return -1; } else return(pq->item[pq->inicio++]); }
#define tamanho 100 struct fila { int inicio,fim; int item[tamanho]; }; struct fila q; int filaRetira(struct fila *pq) { int x; if (filaVazia(pq)) { printf(fila vazia"); return -1; } else { x = pq->item[pq->inicio]; pq->inicio=pq->inicio+1; return x; } }

No programa principal chamamos a funo retira da seguinte forma x=filaRetira(&q);

Fila

No incio (a), a fila est vazia. Em (b) foram inseridos os itens A, B e C. Em (c)foram eliminados dois elementos, e em (d) foram inseridos dois novos elementos, D e E. O valor de q.inicio 2, e o valor de q.fim 4, de modo que s existem 4- 2 + 1 = 3 elementos na fila. Como o vetor contm cinco elementos, deve existir espao para expandir a fila sem a preocupao com o estouro. Entretanto, para inserir F na fila, q.fim precisa ser aumentado de 1 a 5, e q.item[5] deve ser definido com o valor F. Contudo, q.item um vetor de apenas cinco elementos, de modo que a insero no pode ser feita.

Fila

possvel chegar situao absurda em que a fila est vazia, mas nenhum elemento novo pode ser inserido. evidente que, a representao de vetor descrita anteriormente inaceitvel.

Fila
Uma soluo seria modificar a operao remove de maneira que, quando um item fosse eliminado, a fila inteira fosse deslocada no sentido do incio do vetor. A operao x = filaRemove(&q) seria ento modificada para:

x = pq->item[0]; for (i = 0; i < pq->fim; i++) { pq->item[i] = pq->item[i+1]; } pq->fim=pq->fim - 1;


O elemento na posio 0 do vetor estar sempre no incio da fila.

Exerccios
1. Escrever uma funo em C para retornar a quantidade de elementos em uma fila. 2. Escrever uma funo em C para verificar se duas filas so iguais.

3. Escrever uma funo para inverter os elemento de uma fila (usar pilha)
4. Escrever uma funo para retirar um determinado elemento da fila

You might also like