Escreva um programa que implementa uma fila armazenada em uma lista circular estática. Considere que os elementos da fila são números inteiros.

Passo 1

Beleza, vamos resolver esse exercício juntos! A ideia aqui é escrever um programa que implementa uma fila usando uma lista circular estática. A fila é uma estrutura de dados onde os elementos são inseridos no final e removidos do início, seguindo a regra FIFO (First In, First Out). A lista circular estática significa que vamos usar um array com tamanho fixo e tratar o final do array como conectado ao início, formando um círculo. Vamos precisar entender conceitos básicos de filas e arrays circulares para resolver isso.

Passo 2

Primeiro, vamos definir a estrutura da nossa fila. Precisamos de um array para armazenar os elementos, e duas variáveis para indicar o início (frente) e o fim (tras) da fila. Como a lista é circular, vamos usar o operador módulo para garantir que, quando chegarmos ao final do array, voltamos ao começo.

Passo 3

Vamos definir um tamanho fixo para a fila. Por exemplo, vamos supor que a fila pode ter no máximo 5 elementos. Em uma linguagem como C, isso ficaria assim:
#define MAX 5

int fila[MAX];
int frente = -1;
int tras = -1;
Aqui, frente e tras são inicializados como -1 para indicar que a fila está vazia.

Passo 4

Agora, vamos criar a função para inserir um elemento na fila. Precisamos verificar se a fila está cheia antes de adicionar um novo elemento. A condição para a fila estar cheia em uma lista circular é:
(tras + 1) mod MAX = frente
Se a fila não estiver cheia, atualizamos tras e inserimos o elemento.

Passo 5

Em seguida, vamos criar a função para remover um elemento da fila. Primeiro, verificamos se a fila está vazia (frente == -1). Se não estiver vazia, removemos o elemento na posição frente e atualizamos frente. Se, após a remoção, frente for igual a tras, significa que a fila está vazia novamente, então redefinimos ambos para -1.

Passo 6

Vamos também criar uma função para exibir os elementos da fila. Se a fila não estiver vazia, percorremos do frente até o tras, levando em conta o caráter circular do array.

Passo 7

Finalmente, vamos montar tudo isso em um programa completo, com um menu para o usuário escolher entre inserir, remover e exibir elementos da fila.

Resposta

Aqui está um exemplo de implementação em C:
#include <stdio.h>
#include <stdlib.h>

#define MAX 5

int fila[MAX];
int frente = -1;
int tras = -1;

// Função para inserir um elemento na fila
void inserir(int elemento) {
    if ((tras + 1) % MAX == frente) {
        printf("Fila cheia! Não é possível inserir %d\n", elemento);
        return;
    }
    if (frente == -1) { // Se a fila está vazia
        frente = 0;
    }
    tras = (tras + 1) % MAX;
    fila[tras] = elemento;
    printf("Inserido: %d\n", elemento);
}

// Função para remover um elemento da fila
void remover() {
    if (frente == -1) {
        printf("Fila vazia! Não há elementos para remover.\n");
        return;
    }
    int elemento = fila[frente];
    if (frente == tras) { // Se há apenas um elemento
        frente = tras = -1;
    } else {
        frente = (frente + 1) % MAX;
    }
    printf("Removido: %d\n", elemento);
}

// Função para exibir os elementos da fila
void exibir() {
    if (frente == -1) {
        printf("Fila vazia!\n");
        return;
    }
    printf("Elementos da fila: ");
    int i = frente;
    while (1) {
        printf("%d ", fila[i]);
        if (i == tras) {
            break;
        }
        i = (i + 1) % MAX;
    }
    printf("\n");
}

int main() {
    int opcao, valor;
    while (1) {
        printf("\nMenu:\n");
        printf("1. Inserir\n");
        printf("2. Remover\n");
        printf("3. Exibir\n");
        printf("4. Sair\n");
        printf("Escolha uma opção: ");
        scanf("%d", &opcao);
        switch(opcao) {
            case 1:
                printf("Digite o valor para inserir: ");
                scanf("%d", &valor);
                inserir(valor);
                break;
            case 2:
                remover();
                break;
            case 3:
                exibir();
                break;
            case 4:
                printf("Saindo...\n");
                exit(0);
            default:
                printf("Opção inválida! Tente novamente.\n");
        }
    }
    return 0;
}
Explicação Final:
Esse programa permite ao usuário inserir e remover elementos de uma fila implementada com um array circular de tamanho fixo (MAX = 5). Usamos as variáveis frente e tras para controlar onde os elementos estão na fila. Quando tras alcança o final do array, ele volta para o início graças ao operador módulo (%). Isso permite reutilizar o espaço do array de forma eficiente, sem precisar deslocar elementos. O menu no main facilita a interação com o usuário, permitindo testar as operações da fila facilmente.

Exercícios relacionados