Pilha, algoritmos push, pop e imprimir explicados
Publicado por Perfil removido (última atualização em 19/03/2010)
[ Hits: 46.655 ]
Olá pessoal,
Construí uma pilha em C com alocação dinâmica.
Como nos outros códigos, procurei comentar ao máximo.
#include <stdio.h>
#include <string.h>
#include <malloc.h>
/*Declaração do tipo nó para a fila, composto de
ponteiro para o próximo nó e de um campo para dado
que no caso é o campo char dado[30];
*/
typedef struct no {
char dado[30];
struct no *proximo;
} no;
no *topo = NULL; //Ponteiro para o topo da pilha
no *alocar; //Ponteiro para fazer alocação
/*Rotina que faz a inserção de elementos na pilha
O Parâmetro dado recebe um ponteiro para string
A função não retorna valor algum
*/
void push(char *dado) {
alocar = (struct no *) malloc(sizeof(struct no)); //Faz alocação na memória
if (!alocar) { //Se não for possível a alocação, sai do programa
printf("Falta de memória");
exit(0);
}
strcpy(alocar->dado, dado); //Copia o dado para o novo nó alocado
if (!topo) { //Se não houver elemento ainda na pilha, insere
//na base, apontando o ponteiro de topo para o único
//elemento até então inserido
topo = alocar;
topo->proximo = NULL;
}
else //se não...
{
alocar->proximo = topo; //Aponta o próximo para o "antigo" topo da pilha
topo = alocar; //Aponta o ponteiro de topo para o dado que foi alocado
}
}
/*
Rotina que retira elementos da pilha
O elemento retirado sempre é o que está no topo
*/
char * pop() {
char *ponteiro = topo->dado;
topo = topo->proximo;
return ponteiro;
}
/*Imprime todos os elementos da pilha na tela
na ordem de retirada
*/
void imprimir() {
no *ponteiro = topo;
while (ponteiro) {
printf("\n%s", ponteiro->dado);
ponteiro = ponteiro->proximo;
}
}
/*Rotina principal
com alguns pushs e pops
*/
int main() {
char dado[30];
printf("\nInserir: ");
gets(dado);
push(dado);
printf("\nInserir: ");
gets(dado);
push(dado);
printf("\nInserir: ");
gets(dado);
push(dado);
printf("\nInserir: ");
gets(dado);
push(dado);
imprimir();
printf("\nRetirar: ");
getchar();
printf("\nSaiu da pilha: %s", pop());
imprimir();
printf("\nRetirar: ");
getchar();
printf("\nSaiu da pilha: %s", pop());
imprimir();
getchar();
}
Utilizando ponteiros na manipulação de strings
Vetor de números aleatórios não-repetidos de um intervalo em C
Soma dos pares menores que ele
Boas Práticas e Padrões Idiomáticos em Go e C
Vale a pena ter mais de uma interface grafica no seu Linux?
Estrutura e Funcionamento de um Ebuild no Gentoo Linux
Copiar Para e Mover Para no menu de contexto do Nautilus e Dolphin
Dotando o Thunar das opcoes Copiar para e Mover para no menu de contexto
Usando o ble.sh (Bash Line Editor) no lugar do bash completion
Montagem pré automática de HD externo usb em NTFS não funciona no Debian Trixie - Solução
Instalação Dual Boot Linux+Windows 11 (3)
No Ubuntu 26.04, sudo passou a mostrar os asteriscos ao digitar por pa... (5)
Como instalar Warsaw no Gentoo? (0)
Como insiro e excluo um elemento XML e JSON ao código Javascript (1)









