Filas David Menotti Algoritmos e Estruturas de Dados

  • Slides: 21
Download presentation
Filas David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP

Filas David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP

O que é uma fila? 1 4 3 2 Fila 1 © David Menotti

O que é uma fila? 1 4 3 2 Fila 1 © David Menotti 2 3 4 Algoritmos e Estrutura de Dados I

O que é uma fila? Fila 1 © David Menotti 2 3 4 Algoritmos

O que é uma fila? Fila 1 © David Menotti 2 3 4 Algoritmos e Estrutura de Dados I

O que é uma fila? 1 Fila 2 © David Menotti 3 4 Algoritmos

O que é uma fila? 1 Fila 2 © David Menotti 3 4 Algoritmos e Estrutura de Dados I

O que é uma fila? 2 1 Fila 3 © David Menotti 4 Algoritmos

O que é uma fila? 2 1 Fila 3 © David Menotti 4 Algoritmos e Estrutura de Dados I

O que é uma fila? 2 1 3 Fila 4 © David Menotti Algoritmos

O que é uma fila? 2 1 3 Fila 4 © David Menotti Algoritmos e Estrutura de Dados I

TAD Fila n Tipo Abstrato de dados com a seguinte característica: q O primeiro

TAD Fila n Tipo Abstrato de dados com a seguinte característica: q O primeiro elemento a ser inserido é o primeiro a ser retirado/ removido (FIFO – First in First Out) n Analogia: fila bancária, fila do cinema. n Usos: Sistemas operacionais: fila de impressão, processamento © David Menotti Algoritmos e Estrutura de Dados I

TAD Fila Operações: n q q 1. FFVazia(Fila). Faz a fila ficar vazia. 2.

TAD Fila Operações: n q q 1. FFVazia(Fila). Faz a fila ficar vazia. 2. Enfileira(x, Fila). Insere o item x no final da fila. 3. Desenfileira(Fila, x). Retorna o item x no início da fila, retirando-o da fila. 4. Vazia(Fila). Esta função retorna true se a fila está vazia; senão retorna false. © David Menotti Algoritmos e Estrutura de Dados I

Implementação de Filas através de Arranjos n Os itens são armazenados em posições contíguas

Implementação de Filas através de Arranjos n Os itens são armazenados em posições contíguas de memória. n A operação Enfileira faz a parte de trás da fila expandir-se. n A operação Desenfileira faz a parte da frente da fila contrair-se. n A fila tende a caminhar pela memória do computador, ocupando espaço na parte de trás e descartando espaço na parte da frente. © David Menotti Algoritmos e Estrutura de Dados I

Implementação de Filas através de Arranjos n Com poucas inserções e retiradas, a fila

Implementação de Filas através de Arranjos n Com poucas inserções e retiradas, a fila vai ao encontro do limite do espaço da memória alocado para ela. n Solução: imaginar o array como um círculo. A primeira posição segue a última. © David Menotti Algoritmos e Estrutura de Dados I

Implementação de Filas através de Arranjos n A fila se encontra em posições contíguas

Implementação de Filas através de Arranjos n A fila se encontra em posições contíguas de memória, em alguma posição do círculo, delimitada pelos apontadores Frente e Trás. (Frente indica a posição do primeiro elemento, trás a primeira posição vazia) n Para enfileirar, basta mover o apontador Trás uma posição no sentido horário. n Para desenfileirar, basta mover o apontador Frente uma posição no sentido horário. © David Menotti Algoritmos e Estrutura de Dados I

Estrutura da Fila usando Arranjo #include <stdio. h> #include <stdlib. h> #include <sys/time. h>

Estrutura da Fila usando Arranjo #include <stdio. h> #include <stdlib. h> #include <sys/time. h> #define Max. Tam 1000 typedef int Apontador; typedef int Tipo. Chave; typedef struct { Tipo. Chave; /* outros componentes */ } Tipo. Item; typedef struct { Tipo. Item[Max. Tam]; Apontador Frente, Tras; } Tipo. Fila; © David Menotti Algoritmos e Estrutura de Dados I

Operações sobre Filas usando Posições Contínuas de Memória n n n Nos casos de

Operações sobre Filas usando Posições Contínuas de Memória n n n Nos casos de fila cheia e fila vazia, os apontadores Frente e Trás apontam para a mesma posição do círculo. Uma saída para distinguir as duas situações é deixar uma posição vazia no array. Neste caso, a fila está cheia quando Trás+1 for igual a Frente. void FFVazia(Tipo. Fila *Fila) { Fila->Frente = 0; Fila->Tras = Fila->Frente; } /* FFVazia */ int Vazia(Tipo. Fila* Fila) { return (Fila->Frente == Fila->Tras); } /* Vazia */ © David Menotti Algoritmos e Estrutura de Dados I

Operações sobre Filas usando Posições Contínuas de Memória void Enfileira(Tipo. Item x, Tipo. Fila

Operações sobre Filas usando Posições Contínuas de Memória void Enfileira(Tipo. Item x, Tipo. Fila *Fila) { if ( (Fila->Tras + 1) % Max. Tam == Fila->Frente) printf(" Erro: fila está cheian"); else { Fila->Item[Fila->Tras] = x; Fila->Tras = (Fila->Tras + 1) % Max. Tam; } } /* Enfileira */ © David Menotti Algoritmos e Estrutura de Dados I

Operações sobre Filas usando Posições Contínuas de Memória void Desenfileira(Tipo. Fila *Fila, Tipo. Item

Operações sobre Filas usando Posições Contínuas de Memória void Desenfileira(Tipo. Fila *Fila, Tipo. Item *Item) { if (Vazia(Fila)) printf(" Erro: fila está vazian"); else { *Item = Fila->Item[Fila->Frente]; Fila->Frente = (Fila->Frente + 1) % Max. Tam; } } /* Desenfileira */ © David Menotti Algoritmos e Estrutura de Dados I

Implementação de Filas usando Apontadores n n Há uma célula cabeça para facilitar a

Implementação de Filas usando Apontadores n n Há uma célula cabeça para facilitar a implementação das operações Enfileira e Desenfileira quando a fila está vazia. Quando a fila está vazia, os apontadores Frente e Trás apontam para a célula cabeça. Para enfileirar um novo item, basta criar uma célula nova, ligá-la após a célula que contém xn e colocar nela o novo item. Para desenfileirar o item x 1, basta desligar a célula cabeça da lista e a célula que contém x 1 passa a ser a célula cabeça. © David Menotti Algoritmos e Estrutura de Dados I

Estrutura da Fila usando Apontadores n A fila é implementada por meio de células

Estrutura da Fila usando Apontadores n A fila é implementada por meio de células n Cada célula contém um item da fila e um apontador para outra célula. n A estrutura Tipo. Fila contém um apontador para a frente da fila (célula cabeça) e um apontador para a parte de trás da fila. © David Menotti Algoritmos e Estrutura de Dados I

Estrutura da Fila usando Apontadores #include <stdlib. h> #include <sys/time. h> #include <stdio. h>

Estrutura da Fila usando Apontadores #include <stdlib. h> #include <sys/time. h> #include <stdio. h> #define max 10 typedef int Tipo. Chave; typedef struct Tipo. Item { Tipo. Chave; /* outros componentes */ } Tipo. Item; typedef struct Celula_str *Apontador; typedef struct Celula_str { Tipo. Item; Apontador Prox; } Celula; typedef struct Tipo. Fila { Apontador Frente; Apontador Tras; } Tipo. Fila; © David Menotti Algoritmos e Estrutura de Dados I

Operações sobre Filas usando Apontadores void FFVazia(Tipo. Fila *Fila) { Fila->Frente = (Apontador) malloc(sizeof(Celula));

Operações sobre Filas usando Apontadores void FFVazia(Tipo. Fila *Fila) { Fila->Frente = (Apontador) malloc(sizeof(Celula)); Fila->Tras = Fila->Frente; Fila->Frente->Prox = NULL; } /* FFVazia */ int Vazia(Tipo. Fila* Fila) { return (Fila->Frente == Fila->Tras); } /* Vazia */ © David Menotti Algoritmos e Estrutura de Dados I

Operações sobre Filas usando Apontadores void Enfileira(Tipo. Item x, Tipo. Fila *Fila) { Fila->Tras->Prox

Operações sobre Filas usando Apontadores void Enfileira(Tipo. Item x, Tipo. Fila *Fila) { Fila->Tras->Prox = (Apontador) malloc(sizeof(Celula)); Fila->Tras = Fila->Tras->Prox; Fila->Tras->Item = x; Fila->Tras->Prox = NULL; } /* Enfileira */ © David Menotti Algoritmos e Estrutura de Dados I

Operações sobre Filas usando Apontadores void Desenfileira(Tipo. Fila *Fila, Tipo. Item *Item) { Apontador

Operações sobre Filas usando Apontadores void Desenfileira(Tipo. Fila *Fila, Tipo. Item *Item) { Apontador q; if (Vazia(Fila)) { printf(" Erro: fila está vazian"); return; } q = Fila->Frente; Fila->Frente = Fila->Frente->Prox; *Item = Fila->Frente->Item; free(q); } /* Desenfileira */ © David Menotti Algoritmos e Estrutura de Dados I