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++ :