Stack (LIFO)
Publicado por Enzo de Brito Ferber 08/04/2006
[ Hits: 8.816 ]
Homepage: http://www.maximasonorizacao.com.br
Implementaçao de uma pilha, usando listas singularmente encadeadas. Muito bom para ententer o funcionamento de listas singularmente encadeadas.
/* * Programa: Stack * Arquivo: stack.c * Autor: Enzo Ferber 'Slackware_10' */ #include <stdio.H> #include <stdlib.H> #include <string.H> //macros para simplificar alocacao de memoria #define MALLOC(a) (a *)malloc(sizeof(a)); #define CALLOC(n,a) (a *)calloc(n,sizeof(a)); struct s__stack{ int info; struct stack *next; }; typedef struct s__stack stack; //novo tipo de dado 'stack' stack *head; //variavel global para evitar muitas variaveis locais stack *temp; //variavel global para evitar muitas variaveis locais unsigned int num_entradas; //para contador do menu principal //Protótipos de funcoes do programa void push(int); //inserir void pop(void); //deletar void display(void); //mostar void menu(void); //menu principal void clear(void); //limpa tela void ins(void); //valor a inserir void flush(void); //limpa buffer do teclado void push(int valor) { num_entradas++; //apenas para o mostrador na tela principal temp = MALLOC(stack); //ou head = CALLOC(1,stack); temp->info = valor; //atribui o valor temp->next = head; //insere no inicio da lista head = temp; //coloca o novo elemento como primeiro (LIFO) } void ins(void){ clear(); int valor; printf("Valor (decimal): "); flush(); scanf("%d", &valor); push(valor); menu(); } void pop(void) { num_entradas--; //apenas para o mostrador na tela principal stack *t; //novo ponteiro t = head->next; //t contem o endereco do segundo elemento (penultimo a entrar) free(head); //libera espaco previamente alocado para o ultimo elemento que entrou head = t; //transforma o segundo elemento em primeiro } void display(void) { stack *aux = head; //para nao haver distruicao da pilha clear(); //limpa a tela printf("Pilha\n-----\n"); if(!aux){ //se nao houver elementos... printf("Pilha vazia.\n"); //informa erro getch(); //espera uma tecla ser pressionada menu(); //retorna ao menu principal } while(aux){ //enquando nao for NULO printf("%d\n", aux->info); //imprimi o valor aux = aux->next; //faz aux apontar para o proximo item } getch(); //espera uma tecla ser pressionada } void clear(void){ system("clear"); } void flush(void){ __fpurge(stdin); } void menu(void){ int op; while(1){ clear(); if(num_entradas != 0) printf("\n\n\tSTACK\n\n\tTamanho: %d\n\n", num_entradas); else printf("\n\n\tSTACK\n\n\tTamanho: VAZIA\n\n"); printf("\t1. Inserir\n"); printf("\t2. Retirar\n"); printf("\t3. Mostar\n"); printf("\t4. Sair\n\n"); printf("\tSua opcao: "); flush(); scanf("%d", &op); switch(op){ case 1: ins(); break; case 2: pop(); break; case 3: display(); break; case 4: free(head); free(temp); exit(0); } } } int main(void){ head = NULL; menu(); return 0; } /*Nota: * * Este código é uma implementação de 'stack'(pilha) usando o método de listas singularmente * encadeadas. O LIFO (Last In First Out - Ultimo a entrar, primeiro a sair), é * o usado na mémoria de nossos computadores. Segue abaixo um esquema de um programa * escrito em C: * * ______________ * | PILHA | || (seta para baixo - direção para onde a pilha cresce) * |______________| \/ * | HEAP | /\ (seta para cima - direção para onde o heap cresce) * |______________| || * | VARS GLOBAIS | * |______________| * | PROGRAMA | * |______________| * * P.S.: uma grande parte dos compiladores C usam pilhas quando passam argunmentos * para funções. */
Arquivos utilizados no artigo: "Desenvolvendo um plugin para o XMMS"
Funções com número variável de argumentos
Listando processos via /proc/PID
Busca, inserção e remoção de elementos numa lista
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Vou voltar moderar conteúdos de Dicas e Artigos (3)
OpenVPN no MACBOOK conecta mas não pinga pastas de rede compartilhada ... (1)
Melhorando a precisão de valores flutuantes em python[AJUDA] (8)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta