Você está na página 1de 18

Estrutura

de Dados
Prof. Felipe Cavalaro
Fila (Queue)
O que é uma fila?
Fila (Queue)
É simplesmente uma linha de espera que cresce somando
elementos ao seu final e diminui tomando elementos à sua frente.
Diferente de pilha, fila é uma estrutura na qual ambas as
extremidades são usadas: uma para adicionar novos elementos e
outra para removê-los. Em consequência, o último elemento tem que
esperar até que todos os que o precedem na fila sejam removidos.
Fila é uma estrutura FIFO (em inglês, first in/first out) (DROZDEK,
2017).
Fila
Fila

Fila implementada com vetor Se a última posição do vetor


#define MAX 7
estiver ocupada, for
typedef struct p{
float vet[MAX];
necessário inserir um
int inicio,fim; elemento e as primeiras
}filavet; estiverem vazias?

posicao=posicao%7
2.3 5.4 7.2
0 1 2 3 4 5 6

inicio=1 fim=3
Fila

Fila implementada com lista encadeada


typedef struct n {
Fila
float info;
struct n *prox; 2.3 5.7 1.4
}no; inicio info prox info prox info prox

typedef struct f { fim


no* inicio;
no* fim; inicio fim
}fila;
2.3 5.7 1.4
Fila
Exemplo de manipulação de dados na fila
Fila
Principais funções do TAD Fila:

fila* cria(); //cria uma nova fila vazia


int vazia(fila *f); //verifica se a fila está vazia
void insere(fila *f, float dado); //insere um elemento na fila
float remove(fila *f); //remove um elemento da fila
void imprime(fila *f); //mostra os dados da fila
void libera(fila *f); //libera o espaço em memória
Fila

fila* cria (){


fila* f = (fila*) malloc(sizeof(fila));
f->inicio = NULL;
f->fim = NULL;
return f;
}

int vazia (fila* f){


return (f->inicio==NULL);
}
Fila
void insere (fila* f, float dado){
no* novo = (no*) malloc(sizeof(no));
novo->info = dado;
novo->prox = NULL;
if (f->fim != NULL) /* verifica se lista não estava vazia */
f->fim->prox = novo;
f->fim = novo;
if (f->inicio==NULL) /* fila antes vazia? */
f->inicio = f->fim;
}
Fila
float remove (fila* f){
float temp;
if (vazia(f)) {
printf("Fila vazia.\n");
exit(1); /* aborta programa */
}
temp = f->inicio->info;
no* aux = f->inicio->prox;
free(f->inicio);
f->inicio=aux;
if (f->inicio == NULL) /* fila ficou vazia? */
f->fim = NULL;
return temp;
}
Fila
void imprime (fila *f){
no* aux;
for (aux=f->inicio; aux!=NULL; aux=aux->prox)
printf("%f\n",aux->info);
}
Fila
void libera(fila *f){
no* aux = f->inicio;
while (aux!=NULL) {
no* temp = aux->prox;
free(aux);
aux = temp;
}
free(f);
}
Exercícios
1) Considere a existência de um tipo abstrato Fila de números inteiros, cuja
interface está definida no arquivo fila.h da seguinte forma:
typedef struct f fila;
fila* cria(void);
void insere (fila* f, int dado);
int remove (fila* f);
int vazia (fila* f);
void libera (fila* f);
Sem conhecer a representação interna desse tipo abstrato Fila e usando
apenas as funções declaradas, implemente uma função que receba três
filas, f, f_impares e f_pares, e separe todos os valores guardados em f de
tal forma que os valores pares são movidos para a fila f_pares e os valores
ímpares para f_impares.
Exercícios
1)

Note que, ao final dessa função, a fila f vai estar vazia. Essa função deve obedecer o protótipo:
void separa_filas (fila* f, fila* f_pares, fila* f_impares)
Exercícios
2) Considerando tipo abstrato Fila de números inteiros do exercício anterior, implemente uma
função que, dada uma fila, inverta a ordem de seus elementos. Por exemplo, se a fila
originalmente tiver seus elementos na ordem 4,3,9,2, após a chamada da sua função a fila deve
ter seus elementos na ordem 2,9,3,4. O protótipo da função deve ser: void inverte (fila* f).
Exercícios
3) Considerando tipo abstrato Fila de números inteiros do
exercício anterior, faça uma função que receba como parâmetro
uma fila e remova da fila os números negativos. Utilize o
protótipo:
void remove_negativos (fila* f);
Obrigado
felipe.cavalaro@fatec.sp.gov.br

Você também pode gostar