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 é:
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.