Você está na página 1de 5

Estudos - Fila 07/12

Created Dec 7, 2019 920 PM

Tags

URL

Updated Jun 5, 2020 1000 PM

Conceitos Básicos

É uma lista dinâmica que possui regras de funcionamento

O primeiro elemento a ser inserido é o primeiro a ser removido(First In -


First Out) O primeiro a entrar é o primeiro a sair)

Implementação de fila usando vetor

Uma fila é armazenada em um vetor de tamanho n

Um inteiro fim indica o fim da fila

que é 1 a mais que a posição do último elemento e

é a posição do próximo elemento a ser inserido

Um inteiro ini indica o inicio da fila

que é a posição do primeiro elemento e

é a posição do próximo elemento a ser removido

Note que (fim - ini) corresponde ao número de elementos da fila

e que 0 <= ini <= fim <= n

Assim,

se fim - ini = 0, ou seja, fim = ini a fila está vazia

se fim = n a fila está cheia

Estudos - Fila 07/12 1


Para inserir um elemento fazemos

q[fim++] = x;

que é o mesmo que

q[fim] = x; fim = fim + 1;

Note que essa operação não é segura se a fila estiver cheia.

Para remover um elemento e guardá-lo em x fazemos

x = q[ini++];

que é o mesmo que

x = q[ini]; ini = ini+1;

Note que essa operação não é segura se a fila estiver vazia

As operações de fila levam tempo constante em relação ao tamanho da


mesma i.e. O1.

Implementação de fila circular usando vetor

No vetor, a fila circular pode estar nos dois estados a seguir

No subvetor v[ini...fim-1

Ou na concatenação do subvetor v[ini...n-1 com v[0...fim-1

Estudos - Fila 07/12 2


Para inserir um elemento, é da mesma forma

q[fim++] = x;

Implementação da circularidade

if (fim == n) fim = 0, ou seja

se fim == n, quer dizer que passou da "capacidade do vetor" então


passe para o começo do circulo novamente

Circularidade com aritmética modular ??

fim = fim % n;

Para remover um elemento e guardá-lo em x é a da mesma forma

x = q[ini++];

Fila vazia

ini == fim;

Fila cheia

fim + 1 == ini || (fim + 1 == n && ini = 0;)

Alternativa com aritmética modular ?????

(fim + 1 % n == ini;

Estudos - Fila 07/12 3


Note que a posição fim está sempre desocupada porque precisamos
diferenciar a fila vazia de fila cheia

As operações de manipulação da fila circular levam tempo constante


i.e. O1;

Implementação de fila em lista encadeada

Uma importante decisão de projeto na hora de realizar essa implementação


é mater um apontador para o início e outro para o fim da lista.

Convém adotarmos o início da lista como o início da fila para que a


remoção não fique muito custosa.

Para inserir um elemento em uma fila

não vazia devemos atualizar o ponteiro fim e o ponteiro do último


elemento (ambos apontarão para o novo elemento)

vazia devemos atualizar o ponteiro inicio e o ponteiro fim

Para remover um elemento em uma fila

com vários elementos deve-se atualizar o ponteiro inicio

com um elemento deve-se atualizar os ponteiros inicio e fim

Para checar se uma fila está vazia

ponteiro ini == NULL ou ponteiro fim == NULL;

Para checar se uma fila está cheia

Como é uma lista e são alocações dinâmicas, a fila só enche se a


memória do programa acabar

Para saber o tamanho da lista

Estudos - Fila 07/12 4


Percorre-se a lista com um contador

Ou manter uma variável auxiliar tam que é atualizada nas inserções e


remoções

Note que as operações de manipulação da fila levam tempo constante i.e.


O1

Com exceção do cálculo do tamanho

Estudos - Fila 07/12 5