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

Estructuras de Datos I 

Inicio

Generalidades

Ejercicios

Talleres

Proyecto

Ejercicios "amistosos"

Colas

Una cola es una lista de elementos, los cuales se insertan por un extremo y se eliminan por otro. Los elementos se eliminan en el mismo orden en el que se insertaron. Por lo tanto, el primer elemento que entra a la cola será el primero en salir. Debido a esta característica, las colas también reciben el nombre de estructuras FIFO (First-In, First-Out: primero en entrar, primero en salir).  Una cola de espera es similar a una línea de pagos en un supermercado -la primera persona en la línea es atendida primero, y los otros clientes entran en la línea únicamente por la parte final y esperan para ser atendidos-. Los nodos de la cola son eliminados sólo de la parte delantera o cabeza de la cola, y son incluidos únicamente en la parte trasera de la cola.  Existen numerosos casos de colas en la vida real: Las personas esperando para utilizar un teléfono público (la primera persona de la fila o cola será la primera que use el teléfono), las personas que esperan frente a un cajero automático, la cola de automóviles en una estación de servicio de gasolina, los niños que esperan para subir a un juego mecánico en el parque de diversión, etc.

Las colas tienen muchas aplicaciones en sistemas de cómputo. Muchos computadores tienen un solo procesador, de tal forma que sólo un usuario puede ser atendido a la vez. Las entradas de los demás usuarios son colocados en una cola. Cada entrada avanza en forma gradual hacia el frente de la cola, conforme los usuarios reciben servicio. La entrada que aparece en la parte delantera de la cola es la siguiente a recibir servicio.

Las colas también se utilizan para apoyar colas de impresión. Un entorno multiusuario con una sola impresora y muchos usuarios generando salidas para impresión. Si la impresora está ocupada, aún así se pueden generar otras salidas. Estas quedan en "espera" en el disco, donde esperan en una cola hasta que la impresora quede disponible.

En las redes de computadores, los paquetes de información también esperan en colas. Cada vez que un paquete llega a un nodo de red, debe ser encaminado al siguiente nodo de red, siguiendo una trayectoria hacia el destino final del paquete. El nodo de enrutamiento envía un paquete a la vez, por lo que los paquetes adicionales quedan en cola, hasta que el enrutador pueda enviarlos.

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

// 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.
// BanCola.cpp
#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 (COLA)"<<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 COLA
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 nota definitiva de los alumnos del curso de ED1. Almacenar en una pila los alumnos que aprobaron la asignatura  y en una cola los que la perdieron.

  2. Almacenar en una Cola la información de los clientes que llegan a una sucursal del Banco de Colombia: Cuenta, nombre, cédula, dirección, teléfono, saldo, tipo y fecha de la última transacción. a) Cuántos clientes consignaron?. b) Porcentaje de clientes que retiraron dinero?. c) Valor promedio recaudado por el banco?. d) Cuál fue el cliente que más transacciones hizo?.

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

  4. Crear una cola con la ficha de N marcas de teléfonos celulares e imprimir un listado de la cola ordenado por modelo.

  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