Olá Pessoal…
Hoje irei exemplificar Pilha e Fila (LIFO e FIFO respectivamente), utilizando a Linguagem C.
Bom pessoal, após exemplificar a Lista Encadeada Dinâmica, abaixo irei mostrar como fazer um programa em C que utilize FIFO e LIFO, mas o que significa essas siglas?… Simples, FIFO significa First In First Out (O primeiro a entrar é o primeiro a sair), e LIFO significa Last In First Out (O último a entrar é o primeiro sair), em português, esses conceitos são chamados de Pilha e Fila, a pilha é o LIFO, e a fila é o FIFO.
O funcionamento de ambas é simples, é usado uma lista encadeada com o uso de ponteiros, no caso da Pilha, sempre o último valor lido, ficará na ‘primeira’ posição da lista, dessa forma, quando for feita a exclusão, um auxiliar aponta para a próxima posição, e a posição atual, é excluída. Abaixo uma imagem que representa a Pilha (LIFO):
Agora no caso da Fila, o valor lido, sempre é passado para o começo, ou seja, esse valor aponta para as próximas posições, e quando for feita a exclusão, é só deletar esse valor do começo. Abaixo uma imagem que representa a Fila (FIFO):
Pilha (LIFO):
//LIFO //Bibliotecas utilizadas #include <stdio.h> #include <stdlib.h> //Se o sistema for Windows adiciona determinada biblioteca, e definindo comandos de limpar e esperar #ifdef WIN32 #include <windows.h> #define LIMPA_TELA system("cls") //Senão for Windows (se for Linux) #else #include <unistd.h> #define LIMPA_TELA system("/usr/bin/clear") #endif //Espera 3 segundos #define ESPERA sleep(3) //Estrutura da lista que será criada typedef struct pilha { int valor; struct pilha *proximo; } Dados; void insere(); void exclui(); void mostra(); void mostra_erro(); //Inicializando os dados da lista Dados *principal = NULL; main(){ char escolha; //Laço que irá mostrar o menu esperando uma opção (char) do { //Limpando a tela, e mostrando o menu LIMPA_TELA; printf("\nMétodo Pilha\n\n"); printf("Escolha uma opção: \n"); printf("\t1 - Inserir valor na Pilha\n"); printf("\t2 - Remover valor da Pilha\n"); printf("\t3 - Mostrar valores da Pilha\n"); printf("\t9 - Sair\n\n"); printf("Resposta: "); scanf("%c", &escolha); switch(escolha) { //Inserindo case '1': insere(); break; //Excluindo case '2': if(principal!=NULL){ exclui(); } else{ printf("\nA Pilha está vazia!\n"); getchar(); } break; //Mostrando case '3': if(principal!=NULL){ mostra(); } else{ printf("\nA Pilha está vazia!\n"); getchar(); } break; case '9': printf("\nObrigado por utilizar esse programa!\n"); printf("------>Terminal de Informação<------\n\n"); ESPERA; exit(0); break; //Se foi algum valor inválido default: mostra_erro(); break; } //Impedindo sujeira na gravação da escolha getchar(); } while (escolha > 0); //Loop Infinito } //Inserção void insere(){ int val; LIMPA_TELA; printf("\nInserção: \n"); printf("--------------------------------------\n"); printf("Insira o valor a ser inserido: "); scanf("%d",&val); //gerando a posição atual Dados *atual = (Dados*)malloc(sizeof(Dados)); atual -> valor = val; //próximo do atual será a principal atual -> proximo = principal; //principal volta a ser a atual principal = atual; printf("\nValor inserido!\n"); printf("--------------------------------------"); getchar(); } //Exclusão void exclui(){ Dados *auxiliar; printf("\nExclusão: \n"); printf("--------------------------------------\n"); //guardando o valor depois da principal auxiliar=principal->proximo; //limpando a principal free(principal); //a principal será a auxiliar principal=auxiliar; printf("\nValor excluido!\n"); printf("--------------------------------------"); getchar(); } //Mostrando void mostra(){ int posicao=0; Dados *nova=principal; LIMPA_TELA; printf("\nMostrando valores: \n"); printf("--------------------------------------\n"); //laço de repetição para mostrar os dados for (; nova != NULL; nova = nova->proximo) { posicao++; printf("Posição %d, contém o valor %d\n", posicao, nova->valor); } printf("--------------------------------------"); getchar(); } //Mostra erro de digitação void mostra_erro(){ LIMPA_TELA; printf("\nErro de Digitação: \n"); printf("--------------------------------------\n"); printf("\nDigite uma opção válida (pressione -Enter- p/ continuar)!\n\n"); printf("--------------------------------------"); getchar(); }
Fila (FIFO):
//FIFO //Bibliotecas utilizadas #include <stdio.h> #include <stdlib.h> //Se o sistema for Windows adiciona determinada biblioteca, e definindo comandos de limpar e esperar #ifdef WIN32 #include <windows.h> #define LIMPA_TELA system("cls") //Senão for Windows (se for Linux) #else #include <unistd.h> #define LIMPA_TELA system("/usr/bin/clear") #endif //Espera 3 segundos #define ESPERA sleep(3) //Estrutura da lista que será criada typedef struct Fila { int valor; struct Fila *proximo; } Dados; void insere(); void exclui(); void mostra(); void mostra_erro(); //Inicializando os dados da lista Dados *principal = NULL; Dados *final = NULL; main(){ char escolha; //Laço que irá mostrar o menu esperando uma opção (char) do { //Limpando a tela, e mostrando o menu LIMPA_TELA; printf("\nMétodo Fila\n\n"); printf("Escolha uma opção: \n"); printf("\t1 - Inserir valor na Fila\n"); printf("\t2 - Remover valor da Fila\n"); printf("\t3 - Mostrar valores da Fila\n"); printf("\t9 - Sair\n\n"); printf("Resposta: "); scanf("%c", &escolha); switch(escolha) { //Inserindo case '1': insere(); break; //Excluindo case '2': if(principal!=NULL){ exclui(); } else{ printf("\nA Fila está vazia!\n"); getchar(); } break; //Mostrando case '3': if(principal!=NULL){ mostra(); } else{ printf("\nA Fila está vazia!\n"); getchar(); } break; case '9': printf("\nObrigado por utilizar esse programa!\n"); printf("------>Terminal de Informação<------\n\n"); ESPERA; exit(0); break; //Se foi algum valor inválido default: mostra_erro(); break; } //Impedindo sujeira na gravação da escolha getchar(); } while (escolha > 0); //Loop Infinito } //Inserção void insere(){ int val; LIMPA_TELA; printf("\nInserção: \n"); printf("--------------------------------------\n"); printf("Insira o valor a ser inserido: "); scanf("%d",&val); Dados *atual = (Dados*)malloc(sizeof(Dados)); atual -> valor = val; atual -> proximo = NULL; //se o principal estiver vazio, será o atual if(principal == NULL){ principal = final = atual; } //senão, o próximo valor que será o atual else{ final->proximo=atual; final=atual; } printf("\nValor inserido!\n"); printf("--------------------------------------"); getchar(); } //Exclusão void exclui(){ Dados *auxiliar; printf("\nExclusão: \n"); printf("--------------------------------------\n"); //o auxiliar será o próximo da principal auxiliar=principal->proximo; //limpando a principal free(principal); //a principal será a auxiliar principal=auxiliar; printf("\nValor excluido!\n"); printf("--------------------------------------"); getchar(); } //Mostrando void mostra(){ int posicao=0; Dados *nova=principal; LIMPA_TELA; printf("\nMostrando valores: \n"); printf("--------------------------------------\n"); //laço de repetição para mostrar os valores for (; nova != NULL; nova = nova->proximo) { posicao++; printf("Posição %d, contém o valor %d\n", posicao, nova->valor); } printf("--------------------------------------"); getchar(); } //Mostrando erro de digitação void mostra_erro(){ LIMPA_TELA; printf("\nErro de Digitação: \n"); printf("--------------------------------------\n"); printf("\nDigite uma opção válida (pressione -Enter- p/ continuar)!\n\n"); printf("--------------------------------------"); getchar(); }
Para quem quiser ler mais sobre o assunto, recomendo dois artigos do nosso parceiro Gabriel Arroyo:
Estrutura de Dados – Fila (FIFO)
Estrutura de Dados – Pilha
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Cara, você recomenda no final “artigos”. Chegando lá ele se refere ao FIFO como pilha.
Boa tarde Rógeres.
Não havia percebido, vou falar com o autor do outro blog.
Abração e boa semana.
Boa tarde, preciso de um programa de controle e entrada em fila. Como o da Elite Active. É modelo de uma piramide, lá do zero., porem em fila classificatória.
Boa noite Roberto, tudo bem?
Se for apenas para estudo, utilize uma fila simples mesmo, agora se quiser fazer algo profissional, talvez terá de envolver banco de dados e registros.
Eu recomendo você pegar um molde de fila, e adequar talvez com árvore binária.
Abraços.
Boa tarde preciso de uma sugestão; no mundo da computação a onde podemos aplicar as Listas, Pilha, fila, arvore Abb, arvore Avl, arvore B…..??????????????????????????????????????????????????
Boa noite Sandro.
Olha, você poderia aplicar listas e pilha, em uma ordenação de produtos por exemplo, com cálculos de saída e entrada de estoque.
Árvores binárias você poderia criar mapas de jogos por exemplo.
Um grande abraço.
como faço para controlar entrada e saida de veiculos ninha Oficina. tipo o carro AAAA-0000 vai fazer revisão de motor .suspenso e manutenção. utilizando a linguagem c #
Boa noite Noberto, tudo bem?
Você pretende criar um sistema do zero? Se sim, talvez seria legal fazer um em Java ou C#, com integração com banco de dados.
Esse artigo é sobre Linguagem C, nela seria um pouco mais complicado desenvolver algo desse tipo.
O que recomendo, é primeiro desenhar toda a lógica do processo, para depois passar para um banco de dados e para uma linguagem de programação.
Qualquer dúvida, fico à disposição.
Abraços.