MAPA – ESTRUTURA DE DADOS I – 52_2025
O estudo das estruturas de dados em Filas e Pilhas é fundamental para entender como organizar e acessar informações de forma eficiente em programação. Uma Fila segue o princípio FIFO (First In, First Out), onde o primeiro elemento inserido é o primeiro a ser removido, ideal para cenários como processamento de tarefas em ordem de chegada. Por outro lado, uma Pilha segue o princípio LIFO (Last In, First Out), em que o último elemento inserido é o primeiro a ser removido, adequada para situações como rastreamento de chamadas de função ou expressões matemáticas. Compreender as operações básicas, como inserção (enqueue/ push), remoção (dequeue/ pop), e visualização (front/ top), permite a implementação eficaz de algoritmos e soluções para uma variedade de problemas computacionais, contribuindo para o desenvolvimento de sistemas robustos e eficientes.
Filas e pilhas são muito importantes em diferentes processos no dia a dia, tanto para processos em computação quanto no “mundo real”. As filas são estruturas sequenciais ordenadas, onde um novo elemento sempre é inserido no final da fila e só pode ser removido o elemento do início da fila. Não se pode “furar a fila”.
Vamos alterar um pouco essa definição de fila para atender a um problema real. Imagine que você entra em uma fila em um banco que é gerenciada através de senhas. Porém, não é uma fila única e simples, mas uma fila que comporta diferentes situações:
- Existem 4 caixas realizando o atendimento.
- As senhas distribuídas possuem uma letra, que indica a categoria, seguida por um número sequencial.
- Considere as seguintes categorias:
– C – Comum
– P – Prioridade (idosos, gestantes, etc.)
– R – Atendimento rápido (operações simples)
- O caixa 1 atende às prioridades. Se não houver prioridades na fila, atendem o próximo da fila, de qualquer categoria.
- Os caixas 2 e 3 realizam atendimentos comuns. Se não houver, atendem o próximo da fila, de qualquer categoria.
- O caixa 4 é especial para atendimentos rápidos. Se não houver, atendem o próximo da fila, de qualquer categoria.
Segue uma implementação em linguagem C seguindo as regras apresentadas.
1 //Bibliotecas
2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <locale.h> 5 6 //Constantes 7 #define tamanho 20 8 9 //Estrutura da Senha 10 typedef struct tsenha { 11 int numero; 12 char tipo; 13 } tsenha; 14 15 //Estrutura da Fila 16 struct tfilabanco { 17 tsenha dados[tamanho]; 18 int ini; 19 int fim; 20 }; 21 22 //Variáveis globais 23 struct tfilabanco fila; 24 int op, proximo; 25 26 //Protipação 27 void fila_entrar(); 28 void fila_sair(); 29 void fila_mostrar(); 30 void menu_mostrar(); 31 32 //Função principal 33 int main(){ 34 setlocale(LC_ALL, “Portuguese”); 35 op = 1; 36 proximo = 1; 37 fila.ini = 0; 38 fila.fim = 0; 39 while (op != 0) { 40 system(“cls”); 41 fila_mostrar(); 42 menu_mostrar(); 43 scanf(“%d”, &op); 44 switch (op) { 45 case 1: 46 fila_entrar(); 47 break; 48 case 2: 49 fila_sair(); 50 break; 51 } 52 } 53 return 0; 54 } 55 56 //Adicionar um elemento no final da Fila 57 void fila_entrar(){ 58 if (fila.fim == tamanho) { 59 printf(“\nA fila está cheia, volte outro dia!\n\n”); 60 system(“pause”); 61 return; 62 } 63 64 char tipo; 65 printf(“\nEscolha o tipo do atendimento:”); 66 printf(“\nC – Comum”); 67 printf(“\nP – Prioridade”); 68 printf(“\nR – Rápido: “); 69 scanf(” %c”, &tipo); 70 if (tipo != ‘C’ && tipo != ‘P’ && tipo != ‘R’) { 71 printf(“\nTipo de atendimento inválido!\n\n”); 72 return; 73 } 74 fila.dados[fila.fim].tipo = tipo; 75 fila.dados[fila.fim].numero = proximo; 76 proximo++; 77 fila.fim++; 78 } 79 80 //Retirar o primeiro elemento da Fila de acordo com o caixa 81 void fila_sair() { 82 if (fila.ini == fila.fim) { 83 printf(“\nFila vazia, mas logo aparece alguém!\n\n”); 84 system(“pause”); 85 } else { 86 int caixa; 87 char tipoatendimento; 88 printf(“\nQual caixa vai atender (1 a 4)?: “); 89 scanf(“%d”, &caixa); 90 switch (caixa) { 91 case 1: 92 tipoatendimento = ‘P’; 93 break; 94 case 2: 95 case 3: 96 tipoatendimento = ‘C’; 97 break; 98 case 4: 99 tipoatendimento = ‘R’; 100 break; 101 default: 102 printf(“\nValor inválido!”); 103 return; 104 } 105 // Define a posição do elemento aser removido como 0 106 int posicao = 0; 107 108 // Procura elemento do tipo correspondente 109 for (int i = 0; i < tamanho; i++) { 110 if (fila.dados[i].tipo == tipoatendimento) { 111 posicao = i; 112 break; 113 } 114 } 115 116 printf(“\n\n###### ATENDIMENTO #########\n”); 117 printf(“Senha: %c-%d\n”, fila.dados[posicao].tipo, fila.dados[posicao].numero); 118 printf(“Caixa: %d\n”, caixa); 119 printf(“###### ATENDIMENTO #########\n\n”); 120 121 // Retira elemento da posição e move os demais 122 for (int i = posicao; i < tamanho; i++) { 123 fila.dados[i].numero = fila.dados[i+1].numero; 124 fila.dados[i].tipo = fila.dados[i+1].tipo; 125 } 126 fila.dados[fila.fim].numero = 0; 127 fila.dados[fila.fim].tipo = ‘ ‘; 128 fila.fim–; 129 } 130 } 131 132 //Mostrar o conteúdo da Fila 133 void fila_mostrar() { 134 int i; 135 printf(“[ “); 136 for (i = 0; i < tamanho; i++) { 137 printf(“%c-%d “, fila.dados[i].tipo, fila.dados[i].numero); 138 } 139 printf(“]\n\n”); 140 } 141 142 //Mostrar o menu de opções 143 void menu_mostrar() { 144 printf(“\nEscolha uma opção:\n”); 145 printf(“1 – Nova senha\n”); 146 printf(“2 – Atender\n”); 147 printf(“0 – Sair\n\n”); 148 } |
Fonte: Elaborado pelo professor, 2024.
Baseado nas regras apresentadas e no código fonte apresentado, RESPONDA às perguntas a seguir:
1- Explique como é possível armazenar número e letra para cada senha nessa solução.
2- Explique como é que o caixa 4 consegue chamar primeiro quem tem senha de atendimento rápido, detalhando esse trecho do algoritmo, e o que acontece caso não haja nenhuma senha dessa categoria.
3- Suponha que a fila esteja composta por: P-512, R-513, C-514, C-515, P-516. Quando o caixa 3 fizer uma chamada, qual senha será atendida? Como fica a fila após esse atendimento?
4 – Nas linhas 76 e 77 há dois incrementos de variáveis. Por que isso é feito e qual é a diferença entre essas variáveis?
O que devo entregar?
Deverá ser entregar as respostas das 4 perguntas anteriores em um arquivo de WORD ou PDF, conforme formulário padrão constante nos materiais da disciplina.
Orientações:
- Acesse o link com um vídeo tutorial para ajudá-lo neste processo de criação e desenvolvimento.
- A entrega deve ser feita exclusivamente por meio do Template de entrega da atividade MAPA disponível no material da disciplina.
- Antes de enviar sua atividade, certifique-se de que respondeu a todas as perguntas e realize uma cuidadosa correção ortográfica.
- Após o envio não são permitidas alterações, ou modificações. Logo, você tem apenas uma chance de enviar o arquivo corretamente. Revise bem antes de enviar!
- Lembre-se que evidências de cópias de materiais, incluindo de outros acadêmicos, sem devidas referências serão inquestionavelmente zeradas. As citações e referências, mesmo que do livro da disciplina, devem ser realizadas conforme normas da Instituição de Ensino.
- Não são permitidas correções parciais no decorrer do módulo, ou seja, o famoso: “professor, veja se minha atividade está certa?”. Isso invalida seu processo avaliativo. Lembre-se que a interpretação da atividade também faz parte da avaliação.
- Procure sanar suas dúvidas junto à mediação em tempo hábil sobre o conteúdo exigido na atividade, de modo que consiga realizar sua participação.
- Atenção ao prazo de entrega, evite envio de atividade em cima do prazo. Você pode ter algum problema com internet, computador, software etc. e os prazos não serão flexibilizados, mesmo em caso de comprovação.
Bons estudos!
Em caso de dúvidas, encaminhar mensagem ao seu Professor(a) Mediador(a).