Coruniversitaria, Corporación Universitaria de Ibagué
Facultad de Ingeniería de Sistemas

Estructuras de Datos I 

Inicio

Generalidades

Ejercicios

Talleres

Proyecto

Ejercicios "amistosos"

Pilas

Una pila es una versión restringida de una lista enlazada. Es una lista de elementos en la cual se pueden insertar o eliminar elementos sólo por uno de los extremos. Por lo tanto, los elementos de una pila serán eliminados en orden inverso al que se insertaron. Es decir, el último elemento que se mete en la pila es el primero que se saca. Existen numerosos casos prácticos de la vida cotidiana en los que se utiliza el concepto de pila: Una pila de monedas, una pila de platos, una pila de latas de cerveza en un supermercado, etc. En el caso de la pila de platos, es de suponer que si el cocinero necesita un plato limpio, tomará el que está encima de todos, que es el último que se colocó en la pila. Debido al orden en el cual se insertan o eliminan elementos de una pila, esta estructura se conoce como LIFO (Last-In-First-Out: último en entrar, primero en salir).  Se referencia una pila mediante un apuntador al elemento superior de la misma.

Las pilas tienen muchas aplicaciones interesantes. Por ejemplo, siempre que se hace una llamada de función, la función llamada debe saber cómo regresar al programa llamador, por lo que la dirección de regreso es introducida en una pila. Si ocurre una serie de llamadas de función, los valores de regreso sucesivos son almacenados en la pila, en orden de últimas entradas, primeras salidas, de forma tal que cada función pueda regresar a su llamador. Las pilas aceptan llamadas de función recursivas, de la misma forma que llamadas normales, no recursivas.

Las pilas contienen el espacio creado para variables automáticas en cada invocación de una función. Cuando la función regresa a su llamador, el espacio para las variables automáticas de dicha función es retirado (popped off) de la pila, y dichas variables dejan de ser conocidas para el programa.

Las pilas son utilizadas por los compiladores en el proceso de evaluar expresiones y de generar código de lenguaje máquina.

**************************************

// BancoPila.cpp
// El siguiente es un programa que puede ser utilizado como base para implementar
// operaciones con listas tipo PILA\COLA. El estudiante debe adicionar y/o modificar
// algunas funciones.
#include "iostream.h"
#include "conio.h"
#include "stdio.h"
#include "stdlib.h"
#include "dos.h"
#include "string.h"
#define cls clrscr()

//Estructura para los nodos que van a almacenar fechas
struct Fecha {
int dia, mes, anno;
};
//____________________________
//Estructura del nodo que almacena los datos del cliente
struct Cliente {
int cedula;
char nombre[50];
Fecha *fec;
int estado;
};
//_____________________________
//Estructura del nodo que almacena los datos de cada una de las transacciones hechas por cada cliente
struct Extracto {
int tipoTransaccion;
double transaccion;
double saldo;
Fecha *fec;
Extracto *sig;
};
//_______________________________
//Estructura principal del nodo que va a conformar la lista principal y a almacenar los datos de la cuenta
struct Cuenta {
int numCuenta;
char tipoCuenta[30];
double saldo;
Cuenta *sig;
Cliente *otro;
Fecha *fec;
Extracto *extra;
};
//_________________________________
// Prototipos de las funciones
void mostrarSaldoClientes(Cuenta *);
void mostrarSaldoCliente(Cuenta *);
void crearCuenta(Cuenta **);
void retiros(Cuenta *);
void deposito(Cuenta *);
void activarEinactivar(Cuenta *);
void liberarMemoria(Cuenta**);
void addInicio(Cuenta **);
void addFinal (Cuenta **);
Cuenta * llenarCuenta();
Cuenta * searchNode(int,Cuenta *);
void aExtracto(Cuenta *, int,double);
void mostrarExtracto(Cuenta *);
//_________________________________
int main (){
int y;
Cuenta *pClien=NULL;
//El menu para acceder a cada una de las funciones
do{
cout<<" "<<"______________"<<endl;
cout<<" "<<"BANCO MiTOLIMA"<<endl;
cout<<" "<<"=============="<<endl<<endl;
cout<<" "<<"MENU PRINCIPAL"<<endl<<endl;
cout<<"1. Crear cuenta (PILA)"<<endl;
cout<<"2. Retiros"<<endl;
cout<<"3. Depositos"<<endl;
cout<<"4. Activar o desactivar cuentas"<<endl;
cout<<"5. Saldo de un cliente"<<endl;
cout<<"6. Saldo de todos los clientes"<<endl;
cout<<"7. Extracto del cliente"<<endl;
cout<<"8. Eliminar una cuenta"<<endl;
cout<<"9. Salir"<<endl;
cout<<"-> ";cin>>y;
switch(y){
case 1:cls; crearCuenta(&pClien);
break;
case 2:retiros(pClien);
break;
case 3:deposito(pClien);
break;
case 4:activarEinactivar(pClien);
break;
case 5:mostrarSaldoCliente(pClien);
break;
case 6:mostrarSaldoClientes(pClien);
break;
case 7:mostrarExtracto(pClien);
break;
case 8:cls;break;
}
}while(y!=9);
liberarMemoria(&pClien);
}
//____________________________________________________
//ATENCION! Esta funcion debe crear un nodo de la PILA
void crearCuenta(Cuenta **pClien){
addFinal(pClien);
cls;
}
Cuenta * llenarCuenta(){
Cuenta *temp;
temp=new Cuenta;
temp->fec=new Fecha;
temp->otro=new Cliente;
temp->otro->fec=new Fecha;
temp->extra=NULL;
cout<<"Por favor, ingrese el numero de cuenta -> ";
cin>>temp->numCuenta;
cout<<endl<<"Fecha de apertura de la cuenta >";
cout<<endl<<"Dia (dd) : ";
cin>>temp->fec->dia;
cout<<"Mes (mm) : ";
cin>>temp->fec->mes;
cout<<"Año (aaaa): ";
cin>>temp->fec->anno;
cout<<endl<<"Tipo de cuenta : ";
cin>>temp->tipoCuenta;
cout<<endl<<"Saldo inicial :$";
cin>>temp->saldo;
cout<<endl<<"Nombre del cliente : ";
gets(temp->otro->nombre);
cout<<endl<<"Cedula : ";
cin>>temp->otro->cedula;
cout<<endl<<"Fecha de nacimiento >"<<endl;
cout<<"Dia : ";
cin>>temp->otro->fec->dia;
cout<<"Mes : ";
cin>>temp->otro->fec->mes;
cout<<"Año : ";
cin>>temp->otro->fec->anno;
cout<<endl<<"Estado de la cuenta? "<<endl;
cout<<"Activo= 0, Inactivo= 1 ->";
cin>>temp->otro->estado;
return temp;
}
//____________________________________________________
//Registra retiros de una cuenta especifica
void retiros(Cuenta *pClien){
int numCuenta;
long retiro;
Cuenta *temp;
cout<<"Digite su numero de cuenta -> "<<endl;
cin>>numCuenta;
temp=searchNode(numCuenta,pClien);
if(temp==NULL){
cout<<"Numero de cuenta NO valido!!!"<<endl;
return;
}
else{
if(temp->otro->estado==0){
cout<<"Cantidad que desea retirar? $";
cin>>retiro;
temp->saldo=(temp->saldo)-retiro;
cout<<"Su nuevo saldo es: $"<<(temp->saldo)<<endl;
aExtracto(pClien,2,retiro);
}
else{
cout<<"Cuenta inactiva"<<endl;
}
}
getche(); cls;
}
//__________________________________________________
//Registra depositos sobre una cuenta especifica
void deposito(Cuenta *pClien){
Cuenta *temp;
int numCuenta;
long deposito;
cout<<"Digite su numero de cuenta -> "<<endl;
cin>>numCuenta;
temp=searchNode(numCuenta,pClien);
if(temp==NULL){
cout<<"Numero de cuenta NO valido!!!"<<endl;
return;
}
else{
if(temp->otro->estado==0){
cout<<"Cantidad que desea consignar? $";
cin>>deposito;
temp->saldo=(temp->saldo)+deposito;
cout<<"Su nuevo saldo es: $"<<(temp->saldo)<<endl;
aExtracto(pClien,1,deposito);
}
else{
cout<<"Cuenta inactiva"<<endl;
}
}getche();cls;
}
//_________________________________________________
//Activa o inactiva una cuenta
void activarEinactivar(Cuenta *pClien){
Cuenta *temp;
int numCuenta,status;
cout<<"Digite su numero de cuenta -> "<<endl;
cin>>numCuenta;
temp=searchNode(numCuenta,pClien);
if(temp==NULL){
cout<<"Numero de cuenta NO valido!!!"<<endl;getche();
return;
}
else{
cout<<"Si desea activarla, digite 0"<<endl;
cout<<"Si desea inactivarla, digite 1"<<endl;
cin>>status;
switch(status){
case (0):cout<<"Su cuenta ha sido activada..."<<endl;
temp->otro->estado=0;
break;
case (1):cout<<"Su cuenta ha sido inactivada..."<<endl;
temp->otro->estado=1;
break;
}
}
getche();cls;
}
//________________________________________________________________
//Muestra el saldo de todas las cuentas
void mostrarSaldoClientes(Cuenta *pClien){
int i=1;
Cuenta *temp;
temp=pClien;
while(temp!=NULL){
cout<<endl<<"Cliente "<<(i)<<":\t$"<<temp->saldo;
temp=temp->sig;
i++;
}
getche(); cls;
}
//___________________________________________________
//Muestra el saldo de una cuenta especifica
void mostrarSaldoCliente(Cuenta *pClien){
Cuenta *temp;
int numCuenta;
cls;
cout<<"Digite su numero de cuenta -> "<<endl;
cin>>numCuenta;
temp=searchNode(numCuenta,pClien);
if(temp!=NULL){
cout<<"Su saldo es: $"<<temp->saldo<<"\t";
}
else{
cout<<"Numero de cuenta NO valido!!!"<<endl;
}
getche();cls;
}
//________________________________________________
//Funcion que almacena los movimientos de la cuenta (Debe ligar los movimientos con la cuenta)
void aExtracto(Cuenta *pClien, int num,double valor){
cout<<"Fecha de la Transaccion >"<<endl;
Extracto *cab, *ult;
cab= new Extracto;
cab->fec=new Fecha;
cab->sig=NULL;
cout<<"Dia (dd) : ";
cin>>cab->fec->dia;
cout<<"Mes (mm) : ";
cin>>cab->fec->mes;
cout<<"Año (aaaa): ";
cin>>cab->fec->anno;
if(num==1)
{
cab->tipoTransaccion=1;
cab->transaccion=valor;
}
else
{
cab->tipoTransaccion=2;
cab->transaccion=valor;
}
if(pClien->extra==NULL){
pClien->extra=cab;
return;
}
ult=pClien->extra;
while(ult->sig!=NULL){
ult=ult->sig;
}
ult->sig=cab;
cab->sig=NULL;
}
//________________________________________
//Funcion que debe mostrar todos los movimientos realizados en una cuenta especifica
void mostrarExtracto(Cuenta *pClien){
int numCuenta;
Cuenta *temp;
Extracto *ult;
cout<<"Digite su numero de cuenta -> "<<endl;
cin>>numCuenta;
temp=searchNode(numCuenta,pClien);
ult=temp->extra;
while(ult!=NULL){
cout<<endl<<ult->fec->dia<<'\t'<<ult->fec->mes<<'\t'<<ult->fec->anno;
if (ult->tipoTransaccion==1){
cout<<'\t'<<"Consignacion ";
}else{
cout<<'\t'<<"Retiro ";
}
cout<<'\t'<<ult->transaccion;
ult=ult->sig;
}
getche();cls;
}
//_____________________________________________________
//Funciones encargadas de adicionar nodos a cada lista
void addInicio(Cuenta **pClien){
Cuenta *temp;
temp=llenarCuenta();
temp->sig=*pClien;
*pClien=temp;
}

void addFinal (Cuenta **pClien){
Cuenta *temp, *ult;
if(*pClien==NULL){
addInicio(pClien);
return;
}
temp=llenarCuenta();
ult=*pClien;
while(ult->sig!=NULL){
ult=ult->sig;
}
ult->sig=temp;
temp->sig=NULL;
}
//__________________________________________
//Funcion que encuentra un nodo especifico de una lista
Cuenta * searchNode(int numCuenta,Cuenta *pClien){
if(pClien==NULL){
cout<<"Lista vacia!!!"<<endl;
return NULL;
}
while((pClien!=NULL)&&(pClien->numCuenta!=numCuenta)){
pClien=pClien->sig;
}
return pClien;
}
//__________________________________________
//Funcion encargada de borrar todos los nodos generados con el uso de la memoria dinamica
void liberarMemoria(Cuenta **pClien){
Cuenta *aux,*aux2;

aux=*pClien;
aux2=*pClien;
while(*pClien != NULL){
aux=*pClien;
if(aux2->sig==NULL){
delete []aux2;
*pClien=NULL;
}
else{
while(aux->sig != NULL){
aux2=aux;
aux=aux->sig;
}
aux2->sig=NULL;
delete []aux;
}
}
}

**************************************

Codificar los siguientes programas de computación en Lenguaje C/C++ :

  1. Crear una lista lineal enlazada sencilla, cuyos nodos tienen la estructura (Info y Enlace) con el nombre y sexo de los alumnos del curso de ED1. Almacenar en una pila los alumnos de sexo femenino y en otra los de sexo masculino.

  2. Modificar el campo Info del nodo N-ésimo de una de las pilas anteriores por un valor dado X.

  3. Crear una lista enlazada tipo pila para guardar el directorio telefónico de la selección colombiana de patinaje. Diseñar un menú con las opciones de Adicionar, Consultar, Modificar, Borrar  e Imprimir nodos de la pila.

  4. Crear una pila con la ficha de N películas e imprimir un listado de la pila.

  5. Escribir un programa que lea una cadena, guardando cada caracter en una Pila a medida que se lee y adicionando simultáneamente a una Cola.

Arriba  


Inicio | Biografía | Cursos | Para pensar... | Para reflexionar... | Para reir | Enlaces

 
Profesor Gustavo Martínez Villalobos
Email: gmartin@nevado.cui.edu.co
Facultad de Ingeniería de Sistemas, Coruniversitaria
Ibagué, Tolima, COLOMBIA