A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Estrutura de Dados (DPADF 0056) Aula 5 – Estr. Clássicas - Fila Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior.

Apresentações semelhantes


Apresentação em tema: "Estrutura de Dados (DPADF 0056) Aula 5 – Estr. Clássicas - Fila Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior."— Transcrição da apresentação:

1 Estrutura de Dados (DPADF 0056) Aula 5 – Estr. Clássicas - Fila Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet Prof. Bruno B. Boniati – www.cafw.ufsm.br/~bruno

2 FIFO - First In First Out

3 O que define uma fila? Para que um elemento entre na fila ele será sempre colocado em uma extremidade denominada final (término, fim); Para que um elemento seja retirado da fila, ele sairá de uma outra extremidade denominada começo (início, frente);

4 Estratégia FIFO First in, first out Os elementos da fila são retirados na mesma ordem em que foram introduzidos: o primeiro a entrar é o primeiro a sair; Não são permitidas operações sobre quaisquer nodos, somente sobre aqueles definidos pela organização da fila.

5 Aplicações de Fila Controle de acesso a recursos compartilhados (fila de impressão, por exemplo)

6 Política de escalonamento de processos baseada em prioridades; Aplicações de Fila (Cont.) Sistema Operacio nal

7 Definição das prioridades em uma lista de downloads; Agendamento de tarefas; Troca de mensagens em um sistema distribuído; Leitura do buffer do teclado; Enfileiramento de pacotes no equipamento de rede, antes de submetê-los ao enlace; Etc. Aplicações de Fila (Cont.)

8 Fila - Implementação Uma fila permite basicamente duas operações: ▫ Enfileirar (inserir um elemento na fila) ▫ Desenfileirar (retirar um elemento da fila) Antes de pensar os algoritmos, precisamos: ▫ Pensar em uma estratégia de armazenamento da estrutura; ▫ Pensar na interface das operações que irão manipular os dados da estrutura;

9 Organização física Para representar fisicamente uma fila podemos usar diferentes estratégias: ▫ Contiguidade física – com o uso de vetores; ▫ Alocação dinâmica ou encadeamento – com a utilização de ponteiros; Vamos adotar a opção 1 (utilização de vetores) em função da simplicidade dos algoritmos; A organização lógica da fila independe da estratégia de armazenamento.

10 Etapa 1 – Definição conceitual #define MAX 100 typedef struct fila { int comeco; int final; int vetor[MAX]; } Fila; De que forma posso representar uma fila?

11 O que podemos fazer com uma fila? Qual é a interface do TAD Fila? Inicialmente precisamos: Criar e inicializar uma fila; Enfileirar (inserir) um elemento; Desenfileirar (retirar) um elemento; Destruir uma fila (liberar a memória ocupada pela mesma); Saber se a fila está vazia; Saber se a fila está cheia; etc...

12 Etapa 2 – Definição das Operações Fila* criaFila(); void liberaFila(Fila* p); int inserir(Fila* p, int v); int retirar(Fila* p, int* v); int estahVazia(Fila* p); int estahCheia(Fila* p);

13 Funcionamento Vetor[5]: Insere 12 Insere 40 Insere 30 Retira Insere 20 Retira Insere 10 Insere 9 1020304012 Erro! Fila cheia começofinal 0 0 1 23 1 2 3 4 5

14 Fila* criaFila(); Aloca memória para a estrutura física; Inicializa os controles de início e o fim da fila; Retorna um ponteiro para a estrutura criada; void liberaFila(Fila* p); Recebe um ponteiro para uma estrutura do tipo fila e libera a memória ocupada por ela;

15 int estahVazia(Fila* p); O que caracteriza uma fila vazia? ▫ O início e o fim da fila estão na mesma posição; int estahCheia(Fila* p); O que caracteriza uma fila cheia? ▫ O fim da fila está na última posição!

16 int inserir(Fila* p, int v); Recebe um ponteiro para uma estrutura do tipo fila e um valor a ser enfileirado; Verifica se a fila já não está cheia; Se não está, então... ▫ Coloca o elemento na posição indicada pelo fim ▫ Incrementa o valor do fim; A função inserir() retorna 1 (um) se o valor foi enfileirado ou então retorna 0 (zero) se não foi possível enfileirar;

17 int retirar(Fila* p, int* v); Recebe um ponteiro para uma estrutura do tipo fila e um ponteiro para uma variável inteira; Verifica se a fila já não está vazia; Se não está, então... ▫ Retira o elemento da posição indicada pelo início; ▫ Incrementa o valor do início; A função retirar() retorna 1 (um) se o valor foi retirado da fila ou então retorna 0 (zero) se não foi possível retirá-lo;

18 Etapa 3 – Implementação e Utilização a = criaFila(); inserir(a,10); inserir(a,20); inserir(a,30); int x; retirar(a, &x); printf("Elemento '%d' retirado",x); liberaFila(a);

19 Exercícios para fixação

20 Labirinto de ouro Dado um labirinto representado por uma matriz NxN, contendo -1 em posições onde há um obstáculo, 1 nas posições onde há ouro e 0 nas posições livres. Escreva um programa para percorrer o labirinto e determinar quanto ouro existe no mesmo. Coloca na fila a posição inicial (x,y) Enquanto a fila não está vazia Remove a posição do início da fila Para cada posição vizinha que é acessível e que não foi visitada, coloque na fila e marque como visitada.

21 “Dobrar” o vetor de forma que as suas extremidades se encontrem

22 Fila circular Observe a seguinte situação (considerando uma fila normal, de tamanho N implementada sobre um vetor): ▫ São inseridos N elementos na fila; ▫ Em seguida são retirados n-2 elementos; ▫ Tenta-se incluir mais um elemento; ▫ O que acontece?  A fila acusará fila cheia! Mas há espaço no vetor!  Isso é um problema da regra que define a fila? Não!  O problema decorre da forma utilizada para representar a fila: o VETOR;

23 Fila circular (cont.) Se modificarmos a organização física da fila e a implementação de suas operações o problema pode ser resolvido. Vamos imaginar um “vetor dobrado” de forma que o fim do vetor se encontre com o início

24 Fila circular (cont.) Antes de mais nada, uma fila circular é uma fila e portanto suas operações acontecem da seguinte forma: ▫ Inclusões: no final da fila; ▫ Retiradas: no início da fila; A diferença está na forma de tratar a organização física da fila. A interface é a mesma da fila tradicional.

25 Definição conceitual #define MAX 100 typedef struct fila { int comeco; int final; int tamanho; int vetor[MAX]; } Fila; Precisamos controlar o tamanho da fila de outra forma!

26 Funcionamento Precisamos garantir que os indicadores de posicionamento da fila circular (começo e final) retornem ao início sempre que atingirem o valor limite do tamanho do vetor; Algo como: variavel = variavel + 1 se variavel > MAX então variavel = 0

27 Funcionamento (cont.) As condições “fila cheia” e “fila vazia” também devem ser alteradas: Uma fila está cheia se o campo que foi adicionado par controlar o tamanho for igual ao tamanho do vetor; Uma fila está vazia se o tamanho for igual a zero;

28 Exercícios para fixação

29 Fila circular Modifique a implementação das operações e da estrutura utilizada para representar uma fila utilizando uma organização circular (conforme os conceitos discutidos até então);


Carregar ppt "Estrutura de Dados (DPADF 0056) Aula 5 – Estr. Clássicas - Fila Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior."

Apresentações semelhantes


Anúncios Google