Fila estática

Declarando a fila

A nossa fila estática será composta de duas estruturas: a primeira, REGISTRO compreende o conjunto de informações que desejamos armazenar em nossa fila. Ela poderia ser substituída por uma única variável. No entanto, pensando nas aplicações do mundo real, faz muito mais sentido pensar no REGISTRO como uma estrutura, que pode conter outras variáveis.

typedef struct{
    int chave;
    char nome[50];
    int idade;
} REGISTRO;

Como já declaramos a estrutura REGISTRO, podemos agora criar uma estrutura chamada FILA, que representará a fila de registros. Por estarmos lidando com uma fila estática, a estrutura FILA é composta por: um vetor de REGISTRO, além de duas variáveis de controle: inicio e qtde.

typedef struct{
    REGISTRO itens[TAM];
    int inicio;
    int qtde;
} FILA;

Na fila, as duas variáveis (inicio e qtde) assumem papéis importantes para auxiliar na implementação.

Logo, o código completo ficaria:

#define TAM 5

typedef struct{
    int chave;
} REGISTRO;

typedef struct{
    REGISTRO itens[TAM];
    int inicio;
    int qtde;
} FILA;

*️⃣ Funções de manipulação da fila

Inicializando a fila estática

void inicializarFila(FILA *f){
    f->inicio = 0;
    f->qtde = 0;
}

Inserindo um item na fila

Para inserirmos um item na lista, precisamos verificar as seguintes condições:

  1. A fila está cheia?
  2. Caso não esteja, qual posição está disponível para inserção?
void inserir(FILA *f, REGISTRO r){
    if(f->qtde < TAM){
        int pos = (f->inicio + f->qtde) % TAM;
        f->itens[pos] = r;
        f->qtde++;
    }    
}

Removendo item da fila

Para remover um item da fila:

void remover(FILA *f){
    if(f->qtde>0){
        f->inicio = (f->inicio + 1) % TAM;
        f->qtde--;
    }
}

Imprimindo a fila

A lógica de impressão da fila pode ser um pouco diferente daquela a que estamos acostumados. Aqui, a variável i do laço de repetição não indica a posição a ser impressa, mas representa cada item existente na fila.

void imprimir(FILA *f){
    int pos = f->inicio;
    for(int i = 0; i < f->qtde; i++){ 
        printf("%d\n", f->itens[pos].chave);
        pos = (pos + 1) % TAM; 
    }
}

🧑🏻‍💻 Testando a fila

int main(void){
    FILA f;
    inicializarFila(&f);
    inserir(&f, (REGISTRO){10});
    inserir(&f, (REGISTRO){20});
    inserir(&f, (REGISTRO){30});
    inserir(&f, (REGISTRO){40});
    imprimir(f);
    remover(&f);
    remover(&f);
    inserir(&f, (REGISTRO){50});
    imprimir(f);
}