Estrutura de Dados Prof. André Cypriano M. Costa
A fila é uma outra estrutura de dados muito utilizada em computação. É uma analogia natural com o conceito de fila que usamos no nosso dia a dia: os elementos saem da fila seguindo a mesma ordem de entrada.
Fila é uma estrutura de dados do tipo “Primeiro a Entrar, Primeiro a Sair”. First In, First Out (FIFO) ou Last In, Last Out (LILO) Uma fila é um conjunto de elementos a partir do qual podem-se eliminar elementos numa extremidade (chamada início da fila) e no qual podem-se inserir elementos na outra extremidade (chamada final da fila). Fila x Pilha
Fila de Impressão Impressora em rede compartilhada por várias máquinas Que documento será impresso primeiro? A estratégia mais simples é tratar todas as requisições com a mesma prioridade. Imprimir os documentos na ordem em que foram submetidos – o primeiro submetido é o primeiro a ser impresso. Processos do Sistema Operacional Fila dos processos prontos para execução Fila dos processos aguardando I/O
novaFila (newQueue) Produz uma fila vazia filaVazia (emptyQueue) Testa se a fila está vazia primeiro (first) Retorna o primeiro elemento da fila inserir (push) Insere um elemento no final da fila remover (pop) Remove o primeiro elemento da fila
Sintaxe Dado φ uma fila (queue): novaFila() → φ vazio filaVazia(fila φ) → boolean push(fila φ, tipo λ) → φ pop(fila φ) → φ primeiro(fila φ) → tipo
Semântica Dado φ uma fila (queue): filaVazia(novaFila()) → filaVazia(push(fila φ, tipo λ)) → pop(push(fila φ, tipo λ) → pop(novaFila()) → primeiro(push(fila φ, tipo λ) → primeiro(novaFila()) → true false φ null λ
#define MAX 10 // definição da estrutura de dados fila typedef struct fila { int tam;// numero de elementos da fila int vet[MAX];// vetor que vai armazenar os elementos } Fila; // declaração de uma variável do tipo Fila Fila fila;
int filaVazia(Fila fila) { // retorna 0 se a condição for Falsa. Caso contrário, // retorna um valor diferente de 0. return (fila.tam == 0); }
Fila push(Fila fila, int elem) { // verifica se a fila está cheia if(fila.tam == MAX) { // capacidade maxima atingida printf(“Fila cheia.\n"); exit(1); // aborta o programa } fila.vet[fila.tam] = elem; // insere o elemento fila.tam++; // atualiza a quantidade de elementos return fila; }
int primeiro(Fila fila) { // verifica se a fila está vazia if(filaVazia(fila)) return -1; // retorna um código de erro // senão o elemento do topo da fila else return fila.vet[0]; }
Fila pop(Fila fila) { int i; if(filaVazia(fila)) // verifica se a fila está vazia { printf(“A fila esta vazia!\n”); return fila; // se sim, retorna a referência da fila vazia } // desloca os elementos da fila para frente for(i = 0; i < fila.tam && i != MAX - 1; i++) fila.vet[i] = fila.vet[i + 1];...
// verifica se o índice do vetor foi até a última posição do vetor if(i == MAX – 1) fila.vet[MAX – 1] = -1; //atribui -1 à última posição // decrementa a quantidade de elementos da fila fila.tam--; return fila; }
Implemente, em C, o TAD Fila usando vetor. Na sua implementação deve constar um menu que permite ao usuário Inserir um novo elemento na fila Consultar o primeiro elemento da fila Remover um elemento da fila Fique à vontade para implementar qualquer outra funcionalidade que desejar Por exemplo, uma função que imprime todos os elementos da fila
// definindo a estrutura de dados pilha typedef struct fila { int valor; struct fila *prox; } Fila; // declarando uma pilha Fila *fila;
Fila* novaFila() { return NULL; } Exemplo: // declarando uma variável do tipo fila e inicializando-a Fila *fila = novaFila();
int filaVazia(Fila* fila) { // retorna verdadeiro se a fila estiver vazia, caso // contrário retorna falso return (fila == NULL); }
Fila* push(Fila* fila, int elem) { // criando um backup para o inicio da fila Fila *temp = fila; // alocando espaço para mais um elemento da fila Fila *novo = (Fila*)malloc(sizeof(Fila)); // preenchendo os campos do novo elemento da fila novo -> valor = elem; novo -> prox = NULL;...
// verifica se a fila está vazia if(filaVazia(fila)) // se estiver o primeiro elemento é o novo elemento return novo; // caso contrário, percorre a fila até o último elemento while(temp -> prox != NULL) temp = temp -> prox; // liga o último elemento ao novo elemento temp -> prox = novo; return fila; }
Fila* primeiro(Fila* fila) { // verifica se a fila está vazia if(filaVazia(fila)) return NULL; // retorna o primeiro da fila else return fila; }
Fila* pop(Fila* fila) { // verifica se a fila está vazia if(filaVazia(fila)) return NULL; // cria uma referência para o segundo elemento da fila Fila *temp = fila -> prox; // remove o primeiro elemento free(fila); // retorna o novo elemento referenciado return temp; }
Implemente, em C, o TAD Fila usando ponteiros. Na sua implementação deve constar um menu que permite ao usuário Inserir um novo elemento na fila Consultar o primeiro elemento da fila Remover um elemento da fila Fique à vontade para implementar qualquer outra funcionalidade que desejar Por exemplo, uma função que imprime todos os elementos da fila
// estrutura de um nó da fila typedef struct noFila { int valor; struct noFila *prox; } NoFila; // estrutura que gerencia a // fila typedef struct fila { NoFila* prim; NoFila* ult; } Fila;
Fila* novaFila() { // cria uma estrutura gerenciadora Fila* novaFila = (Fila*)malloc(sizeof(Fila)); // inicializa seus ponteiros novaFila prim = NULL; novaFila ult = NULL; return novaFila; }
int filaVazia(Fila* fila) { // retorna verdadeiro se a fila estiver vazia, caso // contrário retorna falso return (fila prim == NULL); }
Fila* primeiro(Fila* fila) { // verifica se a fila está vazia if(filaVazia(pilha) return NULL; // retorna a referência para o primeiro elemento da fila return fila prim; }
Fila* push(Fila* fila, int elem) { // alocando espaço para mais um elemento da fila NoFila* novo = (NoFila*)malloc(sizeof(NoFila)); // preenchendo os campos do novo elemento da fila novo valor = elem; novo prox = NULL; // verifica se a fila está vazia if(filaVazia(fila)) // insere o primeiro elemento da fila fila prim = fila ult = novo;...
else { // inserindo o último elemento da fila fila ult prox = novo; fila ult = novo; } return fila; }
Fila* pop(Fila* fila) { // verifica se a fila está vazia if(filaVazia(fila)) return NULL; // verifica se existe apenas um elemento else if(fila prim == fila ult) { // remove o elemento e atualiza as referencias free(fila prim); fila prim = fila ult = NULL; }
// existe mais de um elemento na fila else { // cria uma referência para o segundo elemento da fila NoFila* temp = fila prim prox; // remove o primeiro elemento e atualiza as referencias free(fila prim); fila prim = temp; } return fila; }
Implemente a estrutura de dados Fila Melhorada usando a linguagem C. Na sua implementação deve constar um menu que permite ao usuário Inserir um novo elemento na fila Consultar o primeiro elemento da pilha Remover um elemento da fila Fique à vontade para implementar qualquer outra funcionalidade que desejar Por exemplo, uma função que imprime todos os elementos da fila