Stack (LIFO)
Publicado por Enzo de Brito Ferber 08/04/2006
[ Hits: 9.093 ]
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.
*/
AIMG-mostrar imagem fraquimentada em pontos aleatórios
Tipos de Dados Abstrato - TDA - Vetor
Exemplo simples de socket em C/C++
KDE Plasma - porque pode ser a melhor opção de interface gráfica
Gentoo: detectando impressoras de rede e como fixar uma impressora por IP
Como o GNOME conseguiu o feito de ser preterido por outras interfaces gráficas
Por que sua empresa precisa de uma PKI (e como automatizar EMISSÕES de certificados via Web API)
Instalando NoMachine no Gentoo com Systemd (acesso Remoto em LAN)
Gentoo: Trocando wpa_supplicant pelo iwd no NetworkManager (Systemd)
Instalar Linux em notebook Sony Vaio VPCEG13EB (10)
Vou destruir sua infância:) (6)
Quando vocês pararam de testar distros? (24)









