Stack (LIFO)
Publicado por Enzo de Brito Ferber 08/04/2006
[ Hits: 9.066 ]
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.
*/
Thread, Courses, Shell e Aquivo
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Como fazer a instalação do Samba
Como fazer a conversão binária e aplicar as restrições no Linux
Duas Pasta Pessoal Aparecendo no Ubuntu 24.04.3 LTS (19)
Formas seguras de instalar Debian Sid (13)
Malware encontrado em extensões do Firefox. (0)
Fiz uma pergunta no fórum mas não consigo localizar [RESOLVIDO] (21)









