Uma fila é uma estrutura de dados que admite duas operações: entrarNaFila e sairDaFila. A operação entrarNaFila adiciona um novo elemento no final da fila. A operação sairDaFila retira o elemento que está no início da fila. Implementar uma fila como um vetor de valores inteiros e escrever as funções void entrarNaFila(int
, int *f, int
), que inclui o valor
na fila
de
elementos, e int sairDaFila(int *n, int *f) que retira um elemento da fila
de
elementos. Escrever a função main() para alocar o vetor com um tamanho máximo, definido pelo usuário, e para testar as funções entrarNaFila e sairDaFila, mostrando a cada operação, o conteúdo da fila.
Passo 1
Vamos começar resumindo o que o exercício pede: implementar uma fila (FIFO) usando um vetor de inteiros em C, com duas operações—entrarNaFila (enqueue) e sairDaFila (dequeue)—e depois escrever uma função main() que aloque dinamicamente o vetor de tamanho máximo definido pelo usuário, teste essas operações e mostre o conteúdo da fila após cada ação.
Passo 2
Para implementar entrarNaFila, a teoria diz que enfileirar é inserir o novo elemento no final da fila. Como estamos usando um vetor e guardamos o número de elementos em *n, basta fazer f[*n] = x e incrementar *n. Em C fica assim:
A operação sairDaFila retira o elemento que está no início da fila. Primeiro guardamos f[0], depois deslocamos todos os elementos subsequentes uma posição à frente (índice i passa para i-1) e decrementamos *n. Por fim retornamos o valor removido.
Passo 3
Para facilitar a visualização, criamos uma função imprimirFila que recebe n e o vetor f, verifica se está vazia e, caso não, percorre os elementos de 0 a n-1 imprimindo cada um.
Passo 4
Na função main(), pedimos ao usuário o tamanho máximo da fila, fazemos malloc para criar o vetor, inicializamos n=0 e entramos em um laço interativo (menu) que permite chamar entrarNaFila ou sairDaFila, sempre imprimindo o estado atual da fila. Ao final, liberamos a memória e encerramos o programa.
Resposta
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
void entrarNaFila(int *n, int *f, int x) {
f[*n] = x;
(*n)++;
}
f[*n] = x;
(*n)++;
}
int sairDaFila(int *n, int *f) {
if (*n == 0) {
printf(“Fila vazia!\n”);
return -1;
}
int removido = f[0];
for (int i = 1; i < *n; i++) {
f[i - 1] = f[i];
}
(*n)–;
return removido;
}
if (*n == 0) {
printf(“Fila vazia!\n”);
return -1;
}
int removido = f[0];
for (int i = 1; i < *n; i++) {
f[i - 1] = f[i];
}
(*n)–;
return removido;
}
void imprimirFila(int n, int *f) {
if (n == 0) {
printf(“Fila vazia\n”);
return;
}
printf(“Fila atual: “);
for (int i = 0; i < n; i++) {
printf(”%d “, f[i]);
}
printf(”\n”);
}
if (n == 0) {
printf(“Fila vazia\n”);
return;
}
printf(“Fila atual: “);
for (int i = 0; i < n; i++) {
printf(”%d “, f[i]);
}
printf(”\n”);
}
int main() {
int max;
printf(“Digite o tamanho maximo da fila: “);
scanf(”%d”, &max);
int max;
printf(“Digite o tamanho maximo da fila: “);
scanf(”%d”, &max);
int *fila = malloc(max * sizeof(int));
if (fila == NULL) {
printf("Erro de alocacao\n");
return 1;
}
int n = 0;
int opcao, x;
do {
printf("\nEscolha uma operacao: 1-Entrar, 2-Sair, 0-Sair do programa: ");
scanf("%d", &opcao);
switch (opcao) {
case 1:
if (n == max) {
printf("Fila cheia!\n");
} else {
printf("Digite o valor para entrar na fila: ");
scanf("%d", &x);
entrarNaFila(&n, fila, x);
imprimirFila(n, fila);
}
break;
case 2:
x = sairDaFila(&n, fila);
if (x != -1) {
printf("Elemento removido: %d\n", x);
imprimirFila(n, fila);
}
break;
case 0:
printf("Encerrando programa.\n");
break;
default:
printf("Opcao invalida!\n");
}
} while (opcao != 0);
free(fila);
return 0;
}