Professional Documents
Culture Documents
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.
Arquivo 2: fila.h
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:
para
3. fim = (fim+1)%m
para
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.