Stack (LIFO)
Publicado por Enzo de Brito Ferber 08/04/2006
[ Hits: 9.083 ]
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.
*/
Árvore AVL, usando arquivos para armazenamento de dados
AIMG-mostrar imagem fraquimentada em pontos aleatórios
Contar elementos de uma lista encadeada
Converter arquivos Bitmap para ASCII-art
LazyDocker – Interface de Usuário em Tempo Real para o Docker
Instalando COSMIC no Linux Mint
Turbinando o Linux Mint: o poder das Nemo Actions
Inteligência Artificial no desenvolvimento de software: quando começar a usar?
[Resolvido] Algo deu errado ao abrir seu perfil
Usando o VNSTAT para medir o seu consumo de internet
Habilitando clipboard manager no ambiente COSMIC
Quando vocês pararam de testar distros? (14)
Problema com som no laptop (3)
Não estou conseguindo fazer funcionar meu Postfix na versão 2.4 no Deb... (2)









