MAPA – ADSIS – ESTRUTURA DE DADOS I – 52_2024
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:
1. Acesse o link com um vídeo tutorial para ajudá-lo neste processo de criação e desenvolvimento.
2. A entrega deve ser feita exclusivamente por meio do Template de entrega da atividade MAPA disponível no material da disciplina.
3. Antes de enviar sua atividade, certifique-se de que respondeu a todas as perguntas e realize uma cuidadosa correção ortográfica.
4. 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!
5. 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.
6. 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.
7. 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.
8. 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).