Pged 06

913 visualizações

Publicada em

1 comentário
0 gostaram
Estatísticas
Notas
  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
913
No SlideShare
0
A partir de incorporações
0
Número de incorporações
157
Ações
Compartilhamentos
0
Downloads
40
Comentários
1
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Pged 06

  1. 1. Curso Superior de Tecnologia em Telemática Programação e Estruturas de DadosFilas – Fundamentos e Implementações Copyright©2010 Prof. César Rocha cesarocha@ifpb.edu.br 1
  2. 2. Objetivos§ Explorar os conceitos fundamentais acerca do uso de filas utilizando a linguagem C § Organização e implementação, características, vantagens, desvantagens, regras de utilização, operações básicas e algoritmos de implementação§ Neste módulo, serão abordadas ainda as seguintes implementações de filas: seqüencial, encadeada e circular§ Este módulo será utilizado como referência na entrega dos futuros projetos § Implementação das estruturas e algoritmos, criação das bibliotecas e práticas de laboratório 2
  3. 3. Motivação§ Uma das estruturas de dados mais utilizadas em programação é a fila § Um exemplo de utilização em computação é a implementação de uma fila de impressão§ Assim como na pilha, os acessos aos elementos em uma fila também seguem uma regra : § Lembre-se da pilha, onde: Last In First Out § Porém, uma fila é: First In First Out§ A idéia fundamental § Só podemos inserir um novo nó no final da fila § Só podemos retirar a partir do início da fila 3
  4. 4. Estratégia§ Pode-se fazer uma analogia com uma fila de clientes em um banco qualquer: § o primeiro a entrar na fila, será o primeiro a sair e ser atendido (retiramos ele do início ou frente da fila) § o último cliente deve entrar no final da fila e, portanto, será o último a sair (ou ser atendido) na fila§ Portanto: § Não podemos retirar qualquer cliente da fila! § Apenas clientes que estão na frente da fila § Não podemos inserir um cliente na fila de tal forma que ele não seja o último no conjunto de clientes 4
  5. 5. Propriedades§ Propriedades de uma fila: § Existem n elementos enfileirados; § E1 é o elemento no início (ou frente) da fila; § En é o último elemento da fila;§ A inserção de um primeiro elemento E1 em uma fila vazia, torna-o o primeiro a sair da estrutura§ Não se pode consultar qualquer elemento§ A inserção é sempre feita depois do elemento En§ A retirada é sempre feita no elemento E1 5
  6. 6. Tipos de filas § Neste estágio, estaremos trabalhando com três tipos de filas: seqüenciais, encadeadas e circulares Œ Seqüencial: neste TAD, os elementos da fila são armazenados em endereços seqüenciais. Materializada na forma de um vetor (arranjo ou matriz). v[ ] Fila Vazia ? ? ? ... ? Frente= 0 e Fim= -1• É preciso controlar• É preciso controlar Insere A A ? ? ... ? Frente= 0 e Fim= 0o início e o final dao início e o final dafila. Note os camposfila. Note os camposfrente e fim.frente e fim. Insere B A B ? ... ? Frente= 0 e Fim= 1• Como poderíamos• Como poderíamos Insere C A B C ... ? Frente= 0 e Fim= 2adaptar uma listaadaptar uma listaseqüencial à umaseqüencial à umafila?fila? Retira ? B C ... ? Frente= 1 e Fim= 2 6
  7. 7. Tipos de filas§ (Continuação.) • Encadeada: neste TAD, os elementos da fila são elementos encadeados por ponteiros TFilaEnc f* 12 09 Ž Circular: caso particular de filas. Iremos levantar e comentar a necessidade da implementação circular mais à frente§ Importante: são apenas diferentes maneiras de se implementar o TAD, porém todas as três formas seguem a mesma filosofia First In First Out 7
  8. 8. Filas seqüenciais Pense um pouco...§ O que você acha que seria necessário para implementar uma biblioteca de um novo TAD que representasse uma fila seqüencial? Œ um vetor de elementos (tamanho pré-definido) • duas variáveis que controlem a frente e o fim da fila /* filaseq.h */ /* filaseq.h */ /* estruturação */ void criarFila(TFila *fila); void criarFila(TFila *fila); typedef struct fila { int filaVazia(TFila *fila); int filaVazia(TFila *fila); int elementos[MAX]; elementos[MAX]; int filaCheia(TFila *fila); int filaCheia(TFila *fila); int frente; int fim; int enfileirar(TFila *fila, int dado); int enfileirar(TFila *fila, int dado); }TFila; int desenfileirar(TFila *fila, int *d); int desenfileirar(TFila *fila, int *d); void imprimir(TFila *fila); void imprimir(TFila *fila); 8
  9. 9. Mas... há problemas!§ Você deve ter percebido que a parte ocupada do vetor pode chegar à ultima posição § Ou seja, a fila seqüencial vai se deslocando da esquerda (frente) para à direita (fim) em cada retirada Fila ? C D ? ? Frente= 1 e Fim= 2 Insere E e F ? C D E F Frente= 1 e Fim= 4 Retira C ? ? D E F Frente= 2 e Fim= 4 Insere G ? ? D E F Frente= 2 e Fim= 4 § Existem dois elementos vazios na fila, mas nenhum outro elemento pode mais ser inserido! § fila.fim chegou à condição de limite (MAX -1) 9
  10. 10. Mas... há problemas!§ E agora? § Do jeito que está, pode-se chegar a uma situação (absurda) em que a fila estará vazia, mas nenhum elemento novo poderá mais ser inserido! § Conclusão: a representação seqüencial, descrita anteriormente, parece não ser muito boa!§ Poderíamos mudar a função desenfileirar(…) § E fazer o deslocamento à esquerda de todos os elementos a cada retirada na frente da fila, mas... § ...e se a fila tivesse 100 elementos? § Havíamos criticado o deslocamento da lista seqüencial! 10
  11. 11. Solução§ O que se quer é reaproveitar as primeiras posições livres do vetor sem implementar um re-arranjo (trabalhoso) de todos os elementos a cada retirada § Para isso, pode-se incrementar as posições do vetor de maneira “circular” § Ou seja, se o último elemento da fila ocupar a última posição do vetor, inserimos os novos elementos a partir do início do vetor!§ Graficamente: Insere G G D E F Frente= 2 e Fim= 0 11
  12. 12. Filas encadeadas§ O que fazer quando o número máximo de elementos na fila não é conhecido? § Devemos implementar a fila usando uma estrutura de dados dinâmica (com alocação dinâmica) dinâmica § Podemos empregar os conceitos vistos nas listas simplesmente (ou duplamente) encadeadas§ Entretanto, as regras de inserção/remoção, agora, irão mudar! § Algumas funções da lista encadeada (inserir ou remover mediante uma posição qualquer, entre outras) deverão ser eliminadas neste novo TAD 12
  13. 13. Filas encadeadas - modus operandi§ O primeiro elemento (início) da lista encadeada poderá representar a frente atual da fila § Assim, cada novo elemento será inserido no final da lista. Conseqüentemente e, sempre que solicitado, retiramos o elemento a partir do início da lista§ Desta forma, vamos precisar de apenas duas funções auxiliares na lista: Œ uma para inserir no fim (enfileirar) • outra para remover do início (desenfileirar)§ Há apenas uma desvantagem: § Para cada elemento a ser inserido na fila, teremos que percorrer todos os nodos até encontrar o último. 13
  14. 14. Fila encadeada com nó descritor § Vamos utilizar os conhecimentos auferidos em técnicas de encadeamento! § Neste caso em particular, iremos alocar um nó “cabeça” para que possamos ter acesso direto ao final da fila (promover performance) TFilaEncCab f Cabeça 03 Vantagens Vantagens• Acesso direto ao• Acesso direto aoprimeiro nodo;primeiro nodo;• Acesso direto ao• Acesso direto ao 100 110 120último nodo;último nodo;• Informação sobre o• Informação sobre otamanho da lista.tamanho da lista. 14
  15. 15. Algoritmos em C§ O que deverá ser feito pelo aluno: § Escolha e instalação do ambiente a ser trabalhado no laboratório § Modelagem deste TAD (dados e operações) § Implementação dos algoritmos de operações básicas vistos em sala de aula na linguagem C § Utilização das regras de modelagem vistas no módulo anterior (criação de bibliotecas) e modularização § Implantação de código legível e bem documentado § Nomes de variáveis condizentes com o problema § Prática de laboratório 15
  16. 16. Para um bom aproveitamento:§ O aluno deve identificar a relação entre TAD (biblioteca e modularização) com a implementação da fila no código!§ Resolva todas as questões da prática de laboratório de filas circular e encadeada§ Procure o professor ou monitor da disciplina e questione conceitos, listas, etc.§ Não deixe para codificar tudo e acumular assunto para a primeira avaliação. § Este é apenas um dos assuntos abordados na prova! 16

×