Aqui les dejo una pila en c++ con memoria dinamica, esta echa con una lista doblemente enlazada, espero que les sirva!
struct lista{
int dato;
lista *ant;
lista *sig;
};
insertar datos
if(inicio==NULL){
inicio=new lista;
printf("ingresa dato " );
scanf("%d",&inicio->dato) ;
inicio->sig=NULL;
inicio->ant=NULL;
aux=inicio;
aux1=inicio;
}
else{
aux=new lista;
printf("ingresa dato " );
scanf("%d",&aux->dato);
aux->sig=NULL;
aux1->sig=aux;
aux->ant=aux1;
aux1=aux;
}
aux=aux1;
aux1=aux->ant;
aux=NULL;
aux1->sig=NULL;
aux=aux1;
aux=inicio;
while(aux!=NULL){
printf(" %d ",aux->dato);
aux=aux->sig;
}
}
y aqui el codigo completo y validado
#include<stdio.h>
struct lista{
int dato;
lista *ant;
lista *sig;
};
int main(){
char a;
lista *inicio,*aux,*aux1;
inicio=NULL;
do{
printf("PILA 1-push 2-pop 3-imprimir 4-salir " );
scanf("%s",&a );
switch(a){
case '1':
if(inicio==NULL){
inicio=new lista;
printf("ingresa dato " );
scanf("%d",&inicio->dato);
inicio->sig=NULL;
inicio->ant=NULL;
aux=inicio;
aux1=inicio;
}
else{
aux=new lista;
printf("ingresa dato " );
scanf("%d",&aux->dato);
aux->sig=NULL;
aux1->sig=aux;
aux->ant=aux1;
aux1=aux;
}
break;
case '2':
if(inicio==NULL){
printf("no hay mas que borrar" );
}
else{
if(inicio==aux1){
inicio=NULL;
}
else{
aux=aux1;
aux1=aux->ant;
aux=NULL;
aux1->sig=NULL;
aux=aux1;
}
}
break;
case '3':
if(inicio==NULL){
printf("pila vacia" );
}
else{
aux=inicio;
while(aux!=NULL){
printf("%d",aux->dato);
aux=aux->sig;
}
}
break;
default: puts("esa no es una opcion intenta de nuevo" ) ;
}
}while(a!='4');
}
primero declaramos nuestra estructura con los elementos que va a tener
struct lista{
int dato;
lista *ant;
lista *sig;
};
insertar datos
aki en la primera vuelta nos va a crear un nodo llamado inicio que contine dos punteros y un espacio para un entero, el puntero llamado "ant" que apunta a NULL y otro llamado "sig" que tambien apunta a NULL
if(inicio==NULL){
inicio=new lista;
printf("ingresa dato " );
scanf("%d",&inicio->dato) ;
inicio->sig=NULL;
inicio->ant=NULL;
aux=inicio;
aux1=inicio;
}
else{
aux=new lista;
printf("ingresa dato " );
scanf("%d",&aux->dato);
aux->sig=NULL;
aux1->sig=aux;
aux->ant=aux1;
aux1=aux;
}
en la segunda vuelta ya la condicion de inicio==NULL ya no se cumple asi que va a pasar al "else", ahi va a crear otro nodo llamado "aux" y lo va a enlazar con el nodo anterior que se llama "aux1"
Para borrar
aux=aux1;
aux1=aux->ant;
aux=NULL;
aux1->sig=NULL;
aux=aux1;
aux va a moverse asta el ultimo nodo que actualmente se llama aux1, despues aux1 va a moverse al nodo anterior, entonces queda aux1 y sigue aux, ahora solo liberamos aux y ese nodo ya queda eliminado , ahora regresamos a aux a donde esta aux1 por si queremos seguir eliminando
imprimir
aux=inicio;
while(aux!=NULL){
printf(" %d ",aux->dato);
aux=aux->sig;
}
}
por ultimo para imprimir regresamos a al inicio de nuestra pila, de ahi partimos para ir imprimiendo nodo por nodo, con el while estamos aciendo que aux se imprima y que avance un nodo, y va terminar cuabndo aux ya no tenga valor
y aqui el codigo completo y validado
#include<stdio.h>
struct lista{
int dato;
lista *ant;
lista *sig;
};
int main(){
char a;
lista *inicio,*aux,*aux1;
inicio=NULL;
do{
printf("PILA 1-push 2-pop 3-imprimir 4-salir " );
scanf("%s",&a );
switch(a){
case '1':
if(inicio==NULL){
inicio=new lista;
printf("ingresa dato " );
scanf("%d",&inicio->dato);
inicio->sig=NULL;
inicio->ant=NULL;
aux=inicio;
aux1=inicio;
}
else{
aux=new lista;
printf("ingresa dato " );
scanf("%d",&aux->dato);
aux->sig=NULL;
aux1->sig=aux;
aux->ant=aux1;
aux1=aux;
}
break;
case '2':
if(inicio==NULL){
printf("no hay mas que borrar" );
}
else{
if(inicio==aux1){
inicio=NULL;
}
else{
aux=aux1;
aux1=aux->ant;
aux=NULL;
aux1->sig=NULL;
aux=aux1;
}
}
break;
case '3':
if(inicio==NULL){
printf("pila vacia" );
}
else{
aux=inicio;
while(aux!=NULL){
printf("%d",aux->dato);
aux=aux->sig;
}
}
break;
default: puts("esa no es una opcion intenta de nuevo" ) ;
}
}while(a!='4');
}