Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INDICE
CAPITULO I
Introduccin a la Programacin Orientada a Objetos
I.1 Introduccin
....................... 2
I.2 Introduccin al lenguaje de programacin
.......................
I.3 conceptos bsicos
.......................
Objeto
.......................
Clases
.......................
Funciones miembro
.......................
Funciones en lnea
.......................
Constructores y Destructores
.......................
Herencia
.......................
Mensajes
.......................
Encapsulamiento
.......................
Polimorfismo
.......................
4
5
5
5
6
6
9
10
11
11
12
CAPITULO II
Recursividad
II.1 Introduccin
II.2 Escritura de funciones recursivas
II.3. Mtodo de las tres preguntas
II.3.1 Aplicacin
II.4 Tipos de recursin
II.5 Recusividad vs. Iteracin
.......................
.......................
.......................
.......................
.......................
.......................
17
18
19
19
20
22
....................... 23
....................... 23
CAPITULO III
Mtodos de Ordenamiento y Bsqueda
III.1. Introduccin
....................... 24
III.2 Clasificacin interna
....................... 24
III.2.1 Clasificacin por intercambio directo
........ 25
28
29
29
30
31
31
CAPITULO IV
Estructuras de Datos
IV.1. Introduccin
.......................
IV.2 Pilas
.......................
IV.2.1 Representacin
.......................
IV.2.2 Operaciones PUSH
.......................
IV.2.3 Operaciones POP
.......................
IV.3 Colas
.......................
IV.3.1 Representacin
.......................
IV.3.2 Operaciones
.......................
IV.3.3 Comportamiento de los apuntadores
........
IV.3.4 Operacin de insercin
.......................
IV.3.5 Operacin de eliminacin
.......................
IV.4 Cola Circular
.......................
IV.5 Listas
.......................
IV.5.1 Operaciones
.......................
IV.5.2 Notacin
.......................
IV.5.3 Listas sencillamente ligadas
.......................
IV.5.3.1 Operacin de Insercin
.......................
IV.5.3.1 Operacin de Eliminacin
.......................
Bibliografa
32
32
33
34
34
37
37
38
38
38
39
40
42
42
42
43
44
46
....................... 52
Programacin Avanzada
,ntroduccin a la
3rogramacin
2rientada a 2bjetos
Capitulo I
I.1 INTRODUCCIN
Programacin Avanzada
Programacin Avanzada
Caractersticas
de C++ que no
residen en C.
Otras
caractersticas
tiles
Lenguaje C++
Lenguaje C
Caractersticas de C
no utilizadas
normalmente en C++
Caractersticas
comunes a C y C++
Programacin Avanzada
OBJETO
Un objeto es, primero que todo, una abstraccin del mundo real.
CLASES
A pesar de que los trminos Clase y Objeto se mezclan entre s en la
literatura dedicada, a la programacin Orientada a Objetos, para
nuestros propsitos habr una semntica definida y diferenciada de
cada uno de ellos.
Una clase es un tipo definido por el usuario. Generaliza el concepto
de estructura y lo reemplaza con ventaja.
En otras palabras, una clase es un prototipo que define los mtodos y
datos que sern incluidos en un tipo de objeto particular. Esta ltima
definicin, seala ya la distincin entre Clases y Objetos, pues los
ltimos no son ms que instancias de los primeros.
Las clases son estructuras que contienen no slo declaraciones de
datos, sino tambin declaraciones de funciones. Las funciones se
conocen como funciones miembro, e indican qu tipos de cosas
puede hacer una clase.
Para usar una clase, primero tiene que declararla, como se hace en el
caso de estructuras. La declaracin completa de una clase puede
aparecer slo una vez en un programa, tal y como en las estructuras.
Esta es la sintaxis de una declaracin de una clase :
class nombre_de_la_Clase
{
funciones y datos privados
Programacin Avanzada
public:
mtodos(funciones) y
datos pblicos
} lista_de_objetos;
FUNCIONES MIEMBRO
Los mtodos de la clase tambin se denominan funciones miembros
si son la nica forma de accesar a los datos privados de la clase.
FUNCIONES EN LINEA
Una funcin en lnea (inline), es una funcin que es expandida en
lnea cuando es llamada, en lugar de realizar el proceso de construir
un llamado a funcin.
La razn para usar funciones en lnea es la eficiencia y existen dos
formas de declarar una funcin en lnea: La forma explicita y la
forma implcita.
include <iostream.h>
class Vector
{
int c[10];
int e; public:
// definimos la funcin inicia en linea
// en forma implicita
void inicia(void) {e=0;}
void pon_dato(int i); void suma(Vector x, Vector y ); void
Visualizar(void);};
/* Cdigo en linea para la funcin inicia de la clase vector, forma
explicita */
Inline void Vector::inicia (void)
{
e=0;
}
Programacin Avanzada
public:
void leer datos();
//interfaz pblico
};
class articulo
{
float precio;
//privado por defecto
char nombre;
//privado por defecto
public:
void leer indicar();
};
#include<stdio.h>
//Definicin de una clase
class PublicExample
{
int variable;
void function();
};
void PrivateExample::function() {}
//datos privados
void main()
Programacin Avanzada
{
PrivateExample object;
object.variable = 1;
//variable no accesible
int i = object.variable; //variable no accesible
object.function();
printf(" i=%d ",i);
}
//variable no accesible
class A:
protected:
int value_a;
class B: public A
public:
void FB();
class C: public B
public:
void FC();
Figura 1.2. Jerarqua de clases.
La jerarqua de la figura 1.2 se puede expresar con cdigo de esta
manera:
class A{
protected:
int value_a;
};
Programacin Avanzada
class B: public A{
public:
void FB();
};
class C: public B{
public:
void FC();
};
La propiedad de ser protected se extiende indefinidamente hacia
abajo en un rbol de herencia, en tanto que se declare que las clases
derivadas tengan clases de base public. Con este hecho en mente,
cualquier funcin miembro de la clase C o B puede tener acceso al
miembro de datos protected, value_a, de su clase de base A; pero
slo a travs del apuntador this.
Operador this
Nunca se puede llamar a una funcin miembro de una clase a menos
que se asocie con un objeto (una instancia de la clase). En ANSI C
10
CONSTRUCTORES
Y DESTRUCTORES
C++ permite a los Objetos inicializarse por s mismos en el momento
de su creacin. Esta inicializacin automtica se lleva a cabo a travs
del uso de las funciones Constructores.
Un Constructor, es una funcin especial que es miembro de la Clase
y que lleva el mismo nombre que ella.
Un Constructor no debe regresar ningn tipo.
Un Destructor es similar al constrictor pero se le antepone el smbolo
#include <iostream.h>
// Clase pila_car para modelar una Pila de caracteres
class pila_car
{
int size; char* tope, s; public:
pila_car(int sz) {tope = s = new char[size = sz];}
//CONSTRUCTOR
Programacin Avanzada
11
HERENCIA
Es un mecanismo por el cual, una clase de Objetos puede expresarse
como un caso especial de una Clase ms general, con lo cual incluye
automticamente toda la definicin de datos y mtodos de la clase
general.
{
declaraciones de miembros
};
Los especificadores de acceso pueden ser los ya conocidos public,
protected o private.
Una clase derivada de la clase base comida es la clase hamburguesa:
class hamburguesa : public comida
{
declaraciones de miembros
Programacin Avanzada
Atributos
public clase base:
Descripcin
Los miembros pblicos de la clase base
son miembros pblicos de la clase
derivada. Los miembros protegidos de la
clase base son miembros protegidos de la
clase derivada. Los miembros privados de
la clase base permanecen privados a la
clase derivada.
Todos los miembros pblicos y protegidos
de la clase base son miembros privados de
la clase derivada. Los miembros privados
de la clase base son privados en la clase
derivada.
Los miembros public y protected de la
clase base son miembros protegidos de la
clase derivada. Los miembros privados de
la clase base son privados de la clase
derivada.
12
};
En este caso la etiqueta de la clase derivada es hamburguesa. La
clase padre o base tiene visibilidad pblica y su etiqueta (nombre) es
comida.
Es especificador public significa que todos los miembros pblicos de
la clase base (alfa) son tambin miembros pblicos de beta.
MENSAJES
La forma en que los Objetos interactan entre si, es envindose
mensajes pidiendo que se active (ejecute) un Mtodo especfico.
Un mensaje consiste simplemente del nombre del Objeto a quien va
dirigido, seguido del nombre del Mtodo que el receptor sabe como
ejecutar. Si el mtodo requiere informacin adicional, el mensaje
incluye parmetros.
Conceptos tales como Transmisor y Receptor, identifican a los
Objetos que envan y reciben los mensajes.
Programacin Avanzada
ENCAPSULAMIENTO
13
SOBRECARGA DE FUNCIONES
POLIMORFISMO
La posibilidad de que un nombre (identificador), pueda ser usado con
diferentes propsitos, aunque relacionados semnticamente, se
denomina polimorfismo.
Polimorfismo es el trmino usado para describir el proceso por el
cual, diferentes implementaciones de una funcin, pueden ser
accesadas usando el mismo nombre. La frase una interfaz, mltiples
mtodos, caracterizan este proceso.
// existe en <math.h>
Programacin Avanzada
void k (complex z)
{
int i = pow (2,2);
// invoca a pow (int, int)
double d = pow (2.0,2);
// invoca a pow (double, double)
complex z1 = pow (2,z); // invoca a pow (double, complex)
complex z2 = pow (z,2); // invoca a pow (complex, int)
complex z3 = pow (z,z); // invoca a pow (complex, complex)
}
SOBRECARGA DE CONSTRUCTORES
Siendo
los
constructores
por
naturaleza
funciones,
independientemente del servicio nico que presentan a los Objetos,
tambin pueden ser sobrecargados.
14
{ segundos --;
t1 = t2;
}
}
Programacin Avanzada
main (void)
{ timer a (10);
a.run ( );
cout << Dar nmero de segundos: ;
char str [80]; // Especificacin de variable
cin >> str;
timer b (str); // Inicializacin Dinmica
b.run( );
cout << Dar tiempo en minutos y segundos: ;
int min,seg; // Especificacin de variables
cin >> min >> seg;
timer c (min,seg); // Inicializacin Dinmica
c.run( );
return ( );
}
Otra de las mejoras de C++ sobre C, se puede observar en el cdigo
anterior, donde se han sealado dos casos de especificaciones de
variables, en cualquier parte del cdigo, y no nicamente en el
encabezado como es tradicional.
15
SOBRECARGA DE OPERADORES
La Sobrecarga de Operadores, es otro modo de implementar
sobrecarga de funciones (Polimorfismo), aunque por la sintaxis de los
operadores, debemos hacer algunas consideraciones adicionales.
# include <iostream.h>
// Clase punto con sobrecarga de operadores como funciones
//miembros
class punto
{
Programacin Avanzada
16
punto temp;
temp.x = op1.x + op2.x;
temp.y = op1.y + op2.y;
return temp;
};
// Operador + como una funcin amiga
punto operador + (punto op1, punto op2);
{
punto temp;
temp.x = op1.x + op2.x;
temp.y = op1.y + op2.y;
return temp;
};
Programacin Avanzada
17
x = op2.x;
y = op2.y;
return *this;
};
// Sobrecarga de un operador unario (operador ++)
punto punto::operador ++ (void);
{
x ++;
y ++;
return *this;
};
Programacin Avanzada
18
Programacin Avanzada
19
II.1 INTRODUCCIN
La recursividad es una tcnica en la que una funcin se hace llamadas
as misma en el proceso de la realizacin de sus tareas.
La recursividad da al programador una herramienta potente para
resolver ciertos tipos de problemas reduciendo complejidad u
ocultando los detalles del problema.
Una funcin recursiva es una funcin que se llama as misma, ya sea
directa, o indirecta, por lo cual se puede considerar
5ecursividad
Capitulo II
Programacin Avanzada
Ejemplo 1. Factorial
0! = 1, 1!=1 (Caso Base)
Sea n! = n * (n-1) * (n-2) *...... * 1, si n>O (Caso General)
Supongamos que buscamos el valor de 4!, como 4 >0 entonces
usamos la segunda parte de la definicin:
4! = 4 * 3 * 2 * 1 = 24
A continuacin se presentan las funciones en modo iterativo y
recursivo
ITERATIVO:
int Factorial( int n )
{
int i, res=1;
for(i=1; i<=n; i++ )
res = res*i;
return res;
}
RECURSIVO:
int Factorial( int n )
{
if(n==0) return(1);
return(n*Factorial(n-1));
}
20
MTODO
1. Primero, obtener una definicin exacta del
problema a resolver. (Esto, por supuesto, es el primer
paso en la resolucin de cualquier problema de
programacin)
2. A continuacin, determinar el tamao del
problema completo que hay que resolver. Este
tamao determinar los valores de los parmetros en
la llamada inicial a la funcin.
3. Tercero, resolver el caso base en el que el
problema puede expresarse no recursivamente. Por
ltimo, resolver el caso general correctamente en
trminos de un caso ms pequeo del mismo
problema, una llamada recursiva.
Ejemplo: Analizar la funcin factorial utilizando el mtodo anterior.
DEFINICIN : Obtener el factorial de un nmero entero, utilizando
la formula
TAMAO : Los enteros (rango mximo de los enteros)
CASO BASE:
1) Cuando n-- 0
nfact = retum (1)
CASO GENERAL: 2) Cuando se llama a la funcin con un
parmetro disminuido nfact (n-1)
Programacin Avanzada
21
int nfact(int n)
3! = 3*2 =
2!= 2 *1 =
1! = 1
(a)
a)Secuencia de llamadas recursivas
cada llamada recursiva.
(b)
b) Valores regresados de
1.
La pregunta Caso-Base: Hay una salida no
recursiva de la funcin, y la rutina funciona correctamente
para este caso base? .
2.
La pregunta llamador-Ms Pequeo : Cada llamada
recursiva se refiere a un caso ms pequeo del problema
original?
{
if (n==O)
retum(I);
caso base
else
retum(n * nfact(n-1); // caso general
3.
La pregunta Caso-General : Suponiendo que la(s)
llamada(s) recursiva(s) funcionan correctamente, funciona
correctamente toda la funcin?
}
La siguiente figura muestra, como la sucesin de llamadas van
regresando un valor al evaluar 4!
4! = 4* 3 =
6 es regresado
2 es regresado
1 es regresado
24 es regresado
II.3.1 APLICACIN
Programacin Avanzada
1.
La pregunta Caso Base: El caso base ocurre cuando
n=0 a nfact se le asigna el valor de 1. (respuesta es si)
2.
La pregunta Llamador-Ms Pequeo: La respuesta a
esta cuestin debe buscarse en los parmetros pasados en la
llamada recursiva. En la funcin nfact, la llamada recursiva
para n-1. Cada llamada recursiva posterior enva un valor
decrementado del parmetro, hasta que el valor enviado es
finalmente cero. En este punto hemos alcanzado el caso ms
pequeo, y no se hacen ms llamadas recursivas. (respuesta
es si)
3.
La pregunta Caso General : En el caso de la funcin
nfact, necesitamos verificar que la frmula que estamos
usando realmente obtiene una solucin correcta. Suponiendo
que la llamada recursiva nfact(n-1) nos da el valor correcto
de (n-I)!, hacemos la asignacin de n * (n-I)! a nfact. Esta es
la definicin de un factorial (formula (2), por lo tanto,
sabemos que la funcin va bien para todo entero positivo.
(Respuesta si)
22
Ejemplo:
La serie Fibonacci 0, 1, 1, 2, 3, 5, 8, 13, 21........ empieza con
los trminos 0 y 1 y tienen la propiedad de cada trmino siguiente es
la suma de los dos trminos precedentes. Escriba un programa que
calcule dichos serie realizando la funcin recursiva fibonacci(n) de
orden n.
Funcin:
int Fib( int n )
{
if (n<=1)
return(1);
return (Fib(n-1) + Fib(n-2));
}
Ejemplo de Ackerman
int Ack( int n, int m )
{
if(n==0 )
return(m+1);
else If (m==0)
return(Ack(n-1,1));
else
return(Ack(n-1, Ack(n,m-1)));
}
Programacin Avanzada
23
#include <iostream.h>
void paso1 (int i);
void paso2 (int i);
main ()
{
int i=l;
paso1 (i);
retum ();
}
Ejemplo2:
Hacer un programa que escriba en pantalla los
nmeros del 1 al 101 utilizando recursividad indirecta.
void paso2(int i)
{
i++;
cout i "\n";
if (i < 100)
paso 1 (i);
}
Programacin Avanzada
22
// funcin no recursiva
int facti(int n)
{
En general : Una solucin no recursiva es ms eficiente en trminos
de tiempo y espacio de computadora. La solucin recursiva puede
requerir gastos considerables, y deben guardarse copias de variables
locales y temporales. Aunque el gasto de una llamada a una funcin
recursiva no es peor, esta llamada original puede ocultar muchas
capas de llamadas recursivas internas. El sistema puede no tener
suficiente espacio para ejecutar una solucin recursiva de algunos
problemas.
Otro problema : Una solucin recursiva particular puede tener una
ineficiencia inherente. Tal ineficiencia no es debida a la eleccin de
la implementacin del algoritmo; ms bien, es un defecto del
algoritmo en si mismo.
Un problema inherente es que algunos valores son calculados una y
otra vez causando que la capacidad de la computadora se exceda
antes de obtener una respuesta.
La cuestin de la claridad en la solucin es, no obstante, un factor
importante. En algunos problemas una solucin recursiva es ms
simple y ms natural de escribir, como se observa en las siguientes
funciones.
En algunos casos una solucin recursiva es ms simple y ms natural
de escribir
{
if (n==O)
retum(I);
else return 1;
return(n * factr(n -1)
Programacin Avanzada
23
Programacin Avanzada
24
Programacin Avanzada
25
III.1 INTRODUCCIN
La clasificacin se define en general como el proceso de rearreglar
un conjunto de objetos en un orden especfico. Su finalidad es
facilitar la bsqueda posterior de los miembros pertenecientes al
conjunto clasificado. En todos los lugares donde se guardan objetos
que luego es necesario recuperar se lleva a cabo la clasificacin, por
ejemplo, en una biblioteca, en los diccionarios, en las bodegas, etc.
2rdenamiento y
%squeda
Capitulo III
Programacin Avanzada
26
Programacin Avanzada
27
#include <stdio.h>
#include <iostream.h>
class objeto {
int llave;
public:
objeto(int x=0){ llave=x; }
void leer_llave();
void ver_llave();
int obtenllave();
void ponerllave(int x);
};
void objeto::leer_llave() { cin >> llave; }
void objeto::ver_llave() { cout << llave; }
int objeto::obtenllave() { return llave; }
void objeto::ponerllave(int x) { llave=x; }
Programacin Avanzada
class ordena {
int num; /* No se pueden iniciar aqui variables pj num=0 */
short ban;
objeto elementos[100];
public:
ordena(int ne=0){
num=ne;
ban=0;
// objeto elementos[100] ;
/* inicia(); se supone que ya se iniciaron */
}
void lectura();
void burbuja();
void shakesort();
void despliega();
private:
int verifica();
void intercambia(objeto *a, objeto *b);
};
28
void ordena::lectura(){
ban=1;
for (int i=0; i<num; i++) {
cout << " * " << i <<"-->";
elementos[i].leer_llave();
cout << "\n";
}
}
int ordena::verifica(){
if ((ban ==0) || (num <= 0)) {
cout << "No existen elementos a ordenar\n";
return 0;
}
return 1;
}
void ordena::burbuja(){
if (verifica()!=0) {
for (int i=0; i<num-1; i++)
for (int j=num-1; j>=i+1; j--)
if (elementos[j].obtenllave() < elementos[j-1].obtenllave())
intercambia(&elementos[j], &elementos[j-1]);
}
}
void ordena::shakesort(){
int l, r, k, j;
l=1; r=num; k=num;
do{
for(j=r-1; j>=l; j--)
if(elementos[j-1].obtenllave() > elementos[j].obtenllave()){
intercambia(&elementos[j-1], &elementos[j]);
k=j;
}
l=k+1;
Programacin Avanzada
29
Programacin Avanzada
30
Fin inserciondirecta
Si notamos que la secuencia destino A[2]...A[i-1] donde se debe
insertar el elemento, ya est ordenada Este algoritmo puede ser
mejorado determinando rpidamente el punto de insercin. La
eleccin es una bsqueda binaria que prueba la secuencia destino en
la mitad y contina buscando hasta encontrar el punto de insercin.
Este algoritmo de insercin modificado recibe el nombre de insercin
binaria y se presenta a continuacin:
Procedimiento insercionbinaria
Inicio
Para i 2 a n hacer
X A[i] L 1 r i
Mientras L < r hacer
M (L+r) div 2
Si A[m] <= x entonces
L L+1
Sino r m
Fin_si
Para j i a r+1 (decremento en 1) hacer
A[j] A[j-1]
Fin_para
A[r] x
Fin_para
Fin insercionbinaria
En el algoritmo anterior se observa que a veces en lugar de mejorar el
algoritmo, este se deteriora, puesto que hay que realizar ms pasos
por la insercin de un elemento, esto implica mayor tiempo que el
utilizado por la clasificacin de insercin directa.
Programacin Avanzada
31
Procedimiento shellsort
Inicio
H[1] 9 h[2] 5 h[3]
Para m 1 a t hacer
K h[m] s -k
Para I k+1 a n hacer
X a[i] j i-k
si s=0 entonces s -k
S s+1 a[s] x
Mientras x<a[j] hacer
A[j+k] a[j]
J j-k
Fin_mientras
Fin_para
Fin_para
Fin shellsort
3 h[4]
Procedimiento quicksort
Procedimiento sort(L,R)
Inicio
I indice_inicial
J indice_final
X a[(L+J) div 2]
Repetir
Mientras a[i] < x hacer i i+1
Mientras x < a[j] hacer j j-1
Si i <= j entonces
W a[i] a[i] a[j]
A[j] w i i+1 j j-1
Fin_si
Hasta I > j
Si L < J entonces quicksort(L,j)
Si i < R entonces quicksort(i,R
Fin sort
Inicio
Sort(1,n)
Fin quicksort
Programacin Avanzada
32
Programacin Avanzada
33
IV.1 INTRODUCCIN
Una estructura de datos es un conjunto de variables, quiz de tipos
distintos, que se relacionan entre s y que se pueden operar como un
todo. stas son fundamentales para el manejo de informacin y el
desarrollo de sistemas.
(structuras
de
'atos
IV.2.
PILAS
Capitulo IV
Una pila (stack) es una estructura tipo Lifo (Last In First Out), as
que el primero en entrar es el ltimo en salir.
Se dice que los elementos que se guardan en
una estructura de este tipo se apilan, as que
no es posible tomar el de hasta abajo sin antes
quitar los de encima.
Programacin Avanzada
34
IV.2.1. REPRESENTACIN
1
1
2
2
3
3
.
.
.
Tope
max
.
.
.
T
O
P
E
Tope
max
IV.1.2. Operaciones
1
Los elementos de una pila permiten que la pila crezca (hacia arriba)
o decrezca (hacia abajo).
2
3
.
.
.
max
T
O
P
E
Tope
Programacin Avanzada
35
1
2
3
4
5
7
15
Tope
Push (Dato)
Inicio
Si Tope > 1 entonces
Tope Tope - 1
Pila[Tope] Dato
Sino
Escribir Pila llena
Fin_si
1
2
3
4
5
Tope
1
2
3
4
5
15
Tope
Programacin Avanzada
36
1
2
3
4
5
7
15
Tope
15
Programacion Avanzada
Abril 2002*/
#include <iostream.h>
#include <stdio.h>
enum estados{VACIA,NORMAL,SIN_ESPACIO};
1
2
3
4
max= 5
/*
Tope
Pila[Tope]) y el
Programacin Avanzada
stack[tope++]=dato;
}
int pila::pop(void)
{
return(stack[--tope]);
}
void pila::visualizar(void)
{
cout <<" DATOS ";
for (short i=0; i<tope;i++)
cout <<": "<<stack[i];
cout <<" <-- Tope"<<endl;
}
37
short menu(void)
{
short opc;
cout <<"\n\t ***** OPERACIONES CON PILA *****\n";
cout <<"\t\t1. Insertar\n";
cout <<"\t\t2. Extraer\n";
cout <<"\t\t3. Visualizar\n";
cout <<"\t\t4. Estado de la pila \n";
cout <<"\t\t0. Salir \n\n";
cout <<"\t\tDigita tu opcion: ";
cin >> opc;
cout << endl;
return opc;
}
/* Programa para el manejo de una pila esttica */
void pila::pon_estado(void)
{
edo = NORMAL;
if (tope==max) edo=SIN_ESPACIO;
if (tope==0) edo=VACIA;
}
void pila::ver_estado(void)
{
switch (obten_estado())
{
case NORMAL : cout << " Pila NORMAL \n"; break;
case VACIA : cout << " Pila VACIA \n"; break;
case SIN_ESPACIO : cout << " Pila LLENA \n"; break;
}
}
int main()
{
pila pila1;
int x;
short op,tam;
cout << "\n\nDa el tamao de la pila: ";
cin>>tam;
pila1.tamanio(tam);
pila1.pon_estado();
do{
op=menu();
switch(op)
Programacin Avanzada
{
case 1 : if(pila1.obten_estado()!=SIN_ESPACIO)
{
cout <<"Da el elemento a insertar[100] : ";
cin >> x;
pila1.push(x);
pila1.pon_estado();
}
else pila1.ver_estado();
break;
case 2 : if (pila1.obten_estado()!=VACIA)
{
x = pila1.pop();
cout <<"El dato extraido es : "<<x<<endl;
pila1.pon_estado();
}
else cout << " NO HAY DATOS \n";
break;
case 3 : if (pila1.obten_estado()!=VACIA)
pila1.visualizar();
else cout << " NO HAY DATOS \n";
break;
case 4 : pila1.ver_estado();
}
}while (op!=0);
return 0;
38
IV.3. COLAS
Una cola es una lista de elementos en la cual los elementos se
insertan por un extremo y se eliminan por otro.
Una cola es una estructura tipo Fifo (First In First Out), as que el
primero en entrar es el primero en salir. Aqu los elementos salen en
el mismo orden en que entraron.
Se dice que los elementos que se guardan en
una estructura de este tipo se encolan uno
despus del otro, de la misma forma que
funcionan las colas en los bancos o en los
supermercados.
IV.3.1. REPRESENTACIN
Las colas no estn definidas como tales en los lenguajes de
programacin, stas se representan mediante el uso de Arreglos o
Listas ligadas.
Se dice que un Arreglo es un buen recipiente para una cola.
Programacin Avanzada
39
15
1
12
2
Frente
1
min
Fondo
6
max
IV.3.2. OPERACIONES
Frente=Fondo
En una cola se pueden llevar a cabo dos operaciones:
1
min
6
max
Programacin Avanzada
40
Sino
Escribir Cola llena
Fin_si
Fin
Elimina_cola( )
Inicio
Si Frente >= min entonces
Dato Cola[Frente]
Si Frente = Fondo entonces
[si se elimina el ltimo elemento entonces se
vuelve al estado
inicial (cola Vaca)]
Fondo min-1
Frente
Fondo
sino
Frente Frente + 1
Fin_si
Sino
Programacin Avanzada
41
c[e++]=i;
};
int Cola::sacadato_cola(void)
{
if (e == s) {
cout << " La cola esta vacia ";
return 0;
}
return c[s++];
};
/* Caracterizacin de la clase Cola */
int main(void)
{
Cola a,b; // Objetos de la clase Cola
a.inicia();
b.inicia();
a.pon_tamanio(5);
b.pon_tamanio(8);
a.pondato_cola(10);
a.pondato_cola(20);
b.pondato_cola(100);
b.pondato_cola(200);
cout << "COLA A : " << a.sacadato_cola() << "\n";
cout << "COLA A : " << a.sacadato_cola() << "\n";
cout << "COLA A : " << a.sacadato_cola() << "\n";
cout << "COLA B : " << b.sacadato_cola() << "\n";
cout << "COLA B : " << b.sacadato_cola() << "\n";
return 0;
15
1
12
2
21
13
17
5
42
6
Fondo
Frente
y que se realiza sobre ella dos operaciones de eliminacin:
21
13
17
5
Frente
Y ahora una operacin de insercin:
Segn
el
algoritmo
insercin_cola
anteriormente citado, la condicin para
insertar es : Fondo < max, la cual no se
42
6
Fondo
Programacin Avanzada
42
Inicio
Si (Fondo=max y Frente=min) o (Fondo+1=Frente)
entonces
Escribir Cola Llena
sino
Si Fondo=max entonces
Fondo 1
Sino
Fondo
Fondo +1
Fin_si
Colacir[Fondo] Dato
Si Frente < min entonces
Frente min
Fin_si
Fin_si
Fin
47
1
Fondo
21
13
17
5
42
En cuanto a la eliminacin, esta tambin considera que al llegar a la
posicin max, la siguiente posicin es min. De esta manera el
algoritmo es el siguiente:
Elimina_cola_circular
Frente
Inicio
Y la condicin para la insercin ser:
si
(Fondo=max y Frente
(Fondo+1=Frente) entonces
escribir Cola Llena
min
Programacin Avanzada
43
Frente
Frente
Frente + 1
Sino
Fin_si
Fin_si
Fin_si
Fin
IV.5. LISTAS
IV.5.1. OPERACIONES
Al inicio de la lista
Al final de la lista
Programacin Avanzada
44
IV.5.2. NOTACIN
Los nodos son almacenados en un espacio de memoria denominado
Memoria del Montn (Heap), esta memoria es asignada por el
procesador, a solicitud del programa, en tiempo de ejecucin. Cuando
la memoria es asignada se obtiene un apuntador (direccin) al
elemento, as, se usa Crea_nodo(P) para indicar la asignacin de
memoria dinmica que es apuntada por P, esto es:
info
Crea_nodo(P)
sig
Cabeza
Cabeza
Crea_nodo(P)
P^.info
P^.sig
Para indicar que el apuntador sig anota a nada se utiliza:
Info
sig
P^.sig
NULO
Cabeza
Cabeza^.sig
y se denota P^.sig
NULO
cabeza
Programacin Avanzada
45
P^.sig
NULO
cabeza
Sino
[Se recorre la lista para encontrar la ltima posicin]
Cabeza
recorre
cabeza
recorre^.sig
Fin_mientras
Para insertar un dato en una lista sencillamente ligada es necesario
crear un nuevo nodo, recorrer la lista nodo por nodo hasta encontrar
la posicin adecuada y actualizar las ligas para insertar el nuevo
nodo.
Lista Desordenada
Supngase que se tiene una lista donde los datos se insertan siempre
al final de la misma sin importar el orden. En esta caso el algoritmo
de insercin es el siguiente:
Insercin_lista_sencilla_desordenada(dato)
Inicio
Crea_nodo(P)
P^.info
dato
Fin
Lista Ordenada
Si lo que se quiere es tener una lista donde los datos estn ordenados
ascendente o descendentemente, entonces el algoritmo cambia
ligeramente. Aqu, durante el recorrido se verifica que los nodos que
se recorren tengan datos menores o mayores (segn el caso) que el
dato que se va a insertar.
Programacin Avanzada
46
Inicio
P^.info
recorre^.sig
dato
p^.sig
NULO
Sino
cabeza
[insertar al inicio]
cabeza^.sig
NULO
cabeza
Sino
cabeza^.sib
sino
cabeza
anterior
recorre
recorre
recorre
recorre^.sig
Fin_mientras
recorre
Fin_si
Fin_si
Fin_si
Fin
recorre
Programacin Avanzada
47
Cabeza
11
anterior
Cabeza
11
Cabeza
recorre
En este momento
la condicin
(recorre^.sig<>NULO) y
(recorre^.info < dato) ya no se cumple y termina el recorrido,
entonces se verifica si debe insertarse al inicio, al final o entre dos
nodos. No es al inicio (recorre <> cabeza), no es al final (recorre^.sig
= NULO , pero recorre^.info no es menor que dato), entonces es
entre dos nodos:
10
11
cabeza
anterior
5
recorre
11
Cabeza
anterior
5
anterior
recorre
11
recorre
Programacin Avanzada
48
anterior
Para eliminar un dato de una lista sencillamente ligada es necesario
recorrer la lista haciendo una bsqueda del elemento a eliminar:
Mientras(recorre^.sig<>NULO) y (recorre^.info <> dato)
hacer
anterior
recorre
recorre
recorre^.sig
recorre
Esto es:
Si recorre^.info = dato entonces
SI recorre = cabeza entonces [se elimina de la cabeza]
cabeza
Fin_mientras
recorre.sig
Cabeza
5
11
anterior
recorre
Cabeza
11
cabeza
recorre
5
11
Esto es:
Si recorre^.info = dato entonces
Programacin Avanzada
49
recorre.sig
Cabeza
Sino
11
NULO
Anterior
recorre
Esto es:
Si recorre^.info = dato entonces
SI recorre = cabeza entonces [se elimina de la cabeza]
cabeza
recorre.sig
Sino
Si (recorre^.sig = NULO)) entonces [esta al final de la lista]
anterior^.sig
Cabeza
5
11
NULO
recorre^.sig
anterior
recorre
Programacin Avanzada
50
anterior^.sig
recorre.sig
Sino
recorre^.sig
Fin_si
Sino [llego al final sin encontrar el dato]
Escribir Dato no encontrado
recorre^.sig
Fin_si
Entonces el algoritmo completo queda de la siguiente manera:
Eliminacin_lista_sencilla(dato)
Inicio
Si cabeza <> NULO entonces
recorre
cabeza
anterior
recorre
recorre
recorre^.sig
recorre.sig
Si recorre^.info = dato entonces [lo encontro]
Sino
[si esta al final o entre dos nodos, se recorren las
ligas]
cabeza
recorre
[se elimina de la
Programacin Avanzada
51
libera_nodo(recorre)
Sino
[si esta al final o entre dos nodos, se recorren
las ligas]
anterior^.sig
recorre^.sig
libera_nodo(recorre)
Fin_si
Sino [no lo encontro]
Escribir Dato no encontrado
Fin_si
Sino
Escribir Lista Vacia
Fin
struct INFO
{
int dato;
struct INFO *sig;
};
/* Clase lista ligada */
class Listas
{
struct INFO *raiz;
public:
void Insertar(int);
void Mostrar(void);
void Eliminar_todo(void);
void Eliminar(int);
Listas() { raiz=NULL; }
};
/* Definicion de metodos */
void Listas::Insertar(int dato)
{
struct INFO *temp;
struct INFO *ant;
struct INFO *pos;
temp=new (struct INFO);
(*temp).dato=dato;
if(raiz==NULL)
{
raiz=temp;
(*raiz).sig=NULL;
}
else
{
if((*raiz).dato>dato) /* temp.dato */
{
Programacin Avanzada
(*temp).sig=raiz;
raiz=temp;
}
else
{
ant=raiz;
pos=(*raiz).sig;
while( ((*pos).dato<dato) && ((*ant).sig !=NULL) )
{
ant=pos;
pos=(*pos).sig;
}
(*ant).sig=temp;
(*temp).sig=pos;
} /*else*/
} /*else*/
}
void Listas::Mostrar(void)
{
struct INFO *aux;
if(raiz==NULL)
cout<< "No hay elementos a mostrar";
else
{
aux=raiz;
while(aux!=NULL)
{
cout<< (*aux).dato;
cout << " ";
aux=(*aux).sig;
}
}
}
52
void Listas::Eliminar_todo(void)
{
struct INFO *aux;
if(raiz==NULL)
cout<<"Lista vacia";
else
while(raiz!=NULL)
{
aux=raiz;
raiz=(*raiz).sig;
delete(aux);
}
}
void Listas::Eliminar(int dato)
{
struct INFO *aux;
struct INFO *ant;
struct INFO *pos;
if(raiz==NULL)
cout<<"Lista vacia";
else
{
if((*raiz).dato==dato)
{
aux=raiz;
raiz=(*raiz).sig;
delete(aux);
}
else
{
ant=raiz;
pos=(*raiz).sig;
while( ((*ant).sig != NULL) && ( (*pos).dato != dato))
Programacin Avanzada
{
ant=pos;
pos=(*pos).sig;
}
if(pos!=NULL)
{
(*ant).sig=(*pos).sig;
delete(pos);
}
else
cout<<"Dato no encontrado";
}
}
}
int main()
{
Listas a; // objeto lista ligada
a.Insertar(7);
a.Insertar(5);
a.Insertar(20);
a.Insertar(17);
a.Mostrar();
a.Eliminar(17);
a.Mostrar();
cout << "\nEliminar todo\n";
a.Eliminar_todo();
a.Mostrar();
getchar();
return 0;
53
BIBLIOGRAFA
[1]
[2]
Wirth, N.
Algoritms + Data Structures=Programas
Prentice Hall, 1976
[3]
Wirth, N.
Algoritmos + Estructuras de Datos
Prentice Hall,
[4]
Deitel y Deitel
Como programar en C y C++
Prentice Hall, 1999.
[5]
Deitel y Deitel
Como programar en C++ 4 Edicion
Prentice Hall, 2001
[6]
Garcia Fernndez J.
Estructuras de Datos
Notas (BUAP)
[7]