Estrutura de Dados – Básica

Professor: Osvaldo Kotaro Takai.

Aula 9: Filas com Alocação de Memória Estática
O objetivo desta aula é apresentar estrutura de dados Fila e suas aplicações.

Motivação
A estrutura de dados Fila talvez seja a organização 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 consultórios médicos para serem atendidas; entre outros exemplos que podemos encontrar em nosso dia-a-dia. Filas são interessantes, por exemplo, em bancos, pois implementam um critério honesto (ao menos à maioria das pessoas) de atendimento aos seus clientes: o primeiro a entrar na fila é o primeiro a ser atendido. Após o primeiro sair da fila, será a vez do segundo e assim por diante. Esse critério é conhecido como FIFO (First-In, First-Out), ou seja, o primeiro a entrar será o primeiro a sair.

Definição do Tipo Abstrato de Dados Fila
Uma TAD Fila é um conjunto de n elementos (ou nós): x0, x1, ..., xn-1, cuja propriedade estrutural envolve as posições relativas de seus nós. 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 xk−1 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 operações possíveis: 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.

1

O primeiro.cpp 2 .Implementação estática do TAD Fila em C++ O TAD Fila será implementado utilizando variáveis estáticas. Por outro lado. o TAD fila também está preparado para gerar um erro quando se tenta inserir mais do que o tamanho possível.h.cpp. fila. main. no caso um vetor. criando duas filas f e f1 de duas formas diferentes. tenta retirar um nó de uma fila vazia. Naturalmente. utiliza o TAD Fila. A sua implementação dinâmica será estudada na aula 11. As explicações dos exemplos a seguir serão realizadas durante as aulas práticas em laboratório. insere e retira alguns valores e. Arquivo 1: main. descrita abaixo em linguagem C++. O segundo arquivo. contém a implementação do TAD fila. A implementação do TAD Pilha. isso irá gerar um erro conhecido como underflow de fila. no final. foi dividida em dois arquivos. Tal erro é conhecido como overflow de fila.

h 3 .Arquivo 2: fila.

precisamos diferenciar quando a fila está vazia e quando a fila está cheia. Se qtd = m então fila cheia.Arquivo 2: fila. assumimos que exista uma variável qtd é incrementada ou decrementada sempre que se insere ou se retira elementos da fila respectivamente. Se qtd == 0 então fila vazia. Para isso. Para verificar se a fila está cheia faça: 1. fim = primeiro = qtd = 0. para manter sempre o primeiro elemento da fila na posição zero. Para verifica se a fila está vazia faça: 1. necessita deslocar os elementos uma posição à esquerda. 4 . para evitar esse deslocamento. é assumir que a fila é circular: 20 primeiro 10 30 fim fim primeiro 0 1 2 3 4 5 6 7 30 10 20 Na fila circular com capacidade de no máximo m elementos. Uma alternativa de implementação.h (continuação) Fila Circular Note que a operação de remoção da implementação apresentada. para criar a fila faça: 1. Assim.

inicio = (inicio +1)%m Exercícios 1. Caso necessário utilize o recurso de depuração (debug) do IDE Dev-C++. Retorne x. Apresente a ordem de complexidade algorítmica da operação de remoção da implementação apresentada. qtd = qtd – 1 3. 5 . Se fim == m então fim = 0. Incremente os programas main. para 3. Isso pode ser evitado utilizando a operação de resto de divisão: 3. de forma a verificar se todas as operações do TAD Fila estão funcionando corretamente. como foi feito para a implementação do TAD Pilha (aula 8). Observe que as variáveis fim e inicio são sempre verificadas após sofrerem o incremento (linhas 3 e 4). Se inicio == m então inicio = 0. inicio = inicio + 1 4. qtd = qtd + 1 3. Implemente em C++ o TAD FilaCircular e demonstre a sua utilização. Se fim == m então fim = 0. v[fim] = x 2. Faça as alterações necessárias no exemplo apresentado para tornar a classe fila genérica. fim = fim + 1 4. 2. inicio = inicio + 1 4. 4. Para retirar um elemento x da fila que não esteja vazia faça: 1. fim = (fim+1)%m 3. 3. x = v[inicio] 2.Para inserir um elemento x na fila que não esteja cheia faça: 1. fim = fim + 1 4.cpp do exemplo apresentado. para 3. Se inicio == m então inicio = 0 5.

Sign up to vote on this title
UsefulNot useful