You are on page 1of 5

Estrutura de Dados Bsica

Professor: Osvaldo Kotaro Takai.

Aula 9: Filas com Alocao de Memria Esttica


O objetivo desta aula apresentar estrutura de dados Fila e suas aplicaes.

Motivao
A estrutura de dados Fila talvez seja a organizao de dados mais conhecida popularmente. As pessoas normalmente se organizam em fila para serem atendidas nos caixas de supermercados e bancos; carros ficam em fila durante os congestionamentos, muito comuns em grandes cidades; pacientes ficam em fila nos consultrios mdicos para serem atendidas; entre outros exemplos que podemos encontrar em nosso dia-a-dia. Filas so interessantes, por exemplo, em bancos, pois implementam um critrio honesto (ao menos maioria das pessoas) de atendimento aos seus clientes: o primeiro a entrar na fila o primeiro a ser atendido. Aps o primeiro sair da fila, ser a vez do segundo e assim por diante. Esse critrio conhecido como FIFO (First-In, First-Out), ou seja, o primeiro a entrar ser o primeiro a sair.

Definio do Tipo Abstrato de Dados Fila


Uma TAD Fila um conjunto de n elementos (ou ns): x0, x1, ..., xn-1, cuja propriedade estrutural envolve as posies relativas de seus ns. Supondo n > 0, temos que: 1. 2. 3. 4. 5. X0 o primeiro n, o primeiro da fila. para 0 < k < n, xk precedido por xk1 e seguido por xk+1 xn-1 o ltimo n, o ltimo da fila: ultimo = n-1. ultimo = -1 indica que a Fila est vazia. Algumas operaes possveis: a. Criar Fila vazia. b. Destruir Fila. c. Esvaziar Fila. d. Verificar se a Fila est vazia. e. Verificar se a Fila est cheia. f. Retornar tamanho da Fila. g. Retornar n que o primeiro da fila. h. Entrar na fila. i. Sair da fila.

Implementao esttica do TAD Fila em C++


O TAD Fila ser implementado utilizando variveis estticas, no caso um vetor. A sua implementao dinmica ser estudada na aula 11. A implementao do TAD Pilha, descrita abaixo em linguagem C++, foi dividida em dois arquivos. O primeiro, main.cpp, utiliza o TAD Fila, criando duas filas f e f1 de duas formas diferentes, insere e retira alguns valores e, no final, tenta retirar um n de uma fila vazia. Naturalmente, isso ir gerar um erro conhecido como underflow de fila. Por outro lado, o TAD fila tambm est preparado para gerar um erro quando se tenta inserir mais do que o tamanho possvel. Tal erro conhecido como overflow de fila. O segundo arquivo, fila.h, contm a implementao do TAD fila. As explicaes dos exemplos a seguir sero realizadas durante as aulas prticas em laboratrio. Arquivo 1: main.cpp

Arquivo 2: fila.h

Arquivo 2: fila.h (continuao)

Fila Circular
Note que a operao de remoo da implementao apresentada, necessita deslocar os elementos uma posio esquerda, para manter sempre o primeiro elemento da fila na posio zero. Uma alternativa de implementao, para evitar esse deslocamento, assumir que a fila circular:

20 primeiro 10

30 fim

fim

primeiro

30

10

20

Na fila circular com capacidade de no mximo m elementos, precisamos diferenciar quando a fila est vazia e quando a fila est cheia. Para isso, assumimos que exista uma varivel qtd incrementada ou decrementada sempre que se insere ou se retira elementos da fila respectivamente. Assim, para criar a fila faa: 1. fim = primeiro = qtd = 0. Para verificar se a fila est cheia faa: 1. Se qtd = m ento fila cheia. Para verifica se a fila est vazia faa: 1. Se qtd == 0 ento fila vazia.

Para inserir um elemento x na fila que no esteja cheia faa: 1. v[fim] = x 2. qtd = qtd + 1 3. fim = fim + 1 4. Se fim == m ento fim = 0. Para retirar um elemento x da fila que no esteja vazia faa: 1. x = v[inicio] 2. qtd = qtd 1 3. inicio = inicio + 1 4. Se inicio == m ento inicio = 0 5. Retorne x. Observe que as variveis fim e inicio so sempre verificadas aps sofrerem o incremento (linhas 3 e 4). Isso pode ser evitado utilizando a operao de resto de diviso:

3. fim = fim + 1 4. Se fim == m ento fim = 0.

para

3. fim = (fim+1)%m

3. inicio = inicio + 1 4. Se inicio == m ento inicio = 0.

para

3. inicio = (inicio +1)%m

Exerccios
1. Incremente os programas main.cpp do exemplo apresentado, de forma a verificar se todas as operaes do TAD Fila esto funcionando corretamente. Caso necessrio utilize o recurso de depurao (debug) do IDE Dev-C++. 2. Faa as alteraes necessrias no exemplo apresentado para tornar a classe fila genrica, como foi feito para a implementao do TAD Pilha (aula 8). 3. Apresente a ordem de complexidade algortmica da operao de remoo da implementao apresentada. 4. Implemente em C++ o TAD FilaCircular e demonstre a sua utilizao.

You might also like