Sie sind auf Seite 1von 35

Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

Semana 2
PRIMERA UNIDAD 1

Competencias

Revisa los conceptos fundamentales de la programacin


Conoce los elementos de la programacin para implantar estructuras.
Interpreta la estructura de los datos segn su origen
Aprende a combinar los elementos segn la teora de la programacin orientada a objetos.
Valora los algoritmos para encontrar soluciones ptimas en la programacin

Contenido

Principios de la programacin orientada a objetos.

Algoritmos recursivos: la naturaleza de la recursividad. Mtodos recursivos. Algoritmo divide y vencers

Mapa Conceptual
Abstraccin

Encapsulamiento
Principios
POO Modularidad

Herencia

Polimorfismo

Fundamentos de las
estructuras de datos
Definicin

Algoritmos divide y
vencieras Naturaleza
Algoritmos
recursivos

Pila de recursion Caracteristicas

Tipos

1
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

FUNDAMENTOS DE LAS ESTRUCTURAS DE DATOS

6. Principios de la programacin orientada a objetos

Los principios de la programacin orientada a objetos segn Booch, son los siguientes:

Abstraccin.

Encapsulamiento.

Modularidad.

Herencia.

Polimorfismo.

Abstraccin

La abstraccin es uno de los medios ms importantes, mediante el cual nos enfrentamos con la
complejidad inherente al software. La abstraccin es la propiedad que permite representar las
caractersticas esenciales de un objeto, sin preocuparse de las restantes caractersticas (no esenciales).
Abstraccin es la tcnica de quitarle a una idea o a un objeto todos los acompaamientos innecesarios
hasta que los deja en una forma esencial y mnima. Una buena abstraccin elimina todos los detalles
poco importantes y le permite enfocarse y concentrarse en los detalles importantes.
Una abstraccin se centra en la vista externa de un objeto, de modo que sirva para separar el
comportamiento esencial de un objeto de su implementacin. Definir una abstraccin significa describir
una entidad del mundo real, no importa lo compleja que pueda ser y, a continuacin, utilizar esta
descripcin en un programa.
El elemento clave de la programacin orientada a objetos es la clase. Una clase se puede definir como
una descripcin abstracta de un grupo de objetos, cada uno de los cuales se diferencia por su estado
especfico y por la posibilidad de realizar una serie de operaciones. Por ejemplo, una pluma estilogrfica
es un objeto que tiene un estado (llena de tinta o vaca) y sobre la cual se pueden realizar algunas
operaciones (escribir, poner o quitar la tapa, llenar de tinta si est vaca, etc.).
La idea de escribir programas definiendo una serie de abstracciones no es nueva, pero el uso de clases
para gestionar dichas abstracciones en lenguajes de programacin ha facilitado considerablemente su
aplicacin.
La abstraccin es un principio de software importante. Una clase bien diseada expone un conjunto
mnimo de mtodos cuidadosamente considerados que proporcionan el comportamiento esencial de
una clase en una forma fcil de usar. Crear buenas abstracciones de software no es fcil. Encontrar
buenas abstracciones generalmente requiere de un entendimiento muy claro del problema y de su
contexto, gran claridad de pensamiento y amplia experiencia.
Existe un principio muy importante relacionado con la abstraccin, y esta es, la Dependencia mnima. Las
mejores abstracciones de software hacen que las cosas complejas sean simples. Logran esto al ocultar
por completo los aspectos no esenciales de una clase. Estos aspectos no esenciales, una vez que han sido
debidamente ocultados, no se pueden ver, ni usar, ni depender de ellos. Este principio de dependencia
mnima es lo que hace que la abstraccin sea tan importante. El cambio es normal en el desarrollo de
software. Lo mejor que puede hacer es minimizar el impacto de un cambio cuando ste sucede. Y cuanto
menos dependa de algo, menos se ver afectado cuando cambie.
Los lenguajes orientados a objetos proporcionan la Encapsulacin. La encapsulacin se puede utilizar
para aplicar el concepto de Abstraccin.

2
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

Ejemplo
Por ejemplo tienes un carro y quieres "abstraerlo" para hacer un programa en el que puedas realizar
operaciones en base al carro.

Puedes crear una clase con las caractersticas del carro por ejemplo.

class carro {
int cantidadDePuertas;
int modelo;
Color colorcito;
String linea;

public carro (int cantidadDePuertas, int modelo, Color colorcito, String linea){
this.cantidadDePuertas = cantidadDePuertas;
this.modelo = modelo;
this.colorcito = colorcito;
this. linea = linea;
}

Tambin podemos abstraer las acciones de una cuenta bancaria


Clase CuentaBancaria
// atributos
Privado Entero Saldo;
Privado String NroCuenta;
Privado String Titular;
// mtodos
Accin CuentaBancaria(Entero montoInicial; String num, nombre)
// asigna a los atributo de la clase sus valores iniciales
Saldo = montoInicial;
NroCuenta = num;
Titular = nombre;
Faccin;
Pblico Accin depositar(Entero cantidad)
// incrementa el saldo de la cuenta
Saldo = Saldo + cantidad;
Faccin;
Pblico Accin retirar(Entero cantidad)
// disminuye el saldo de la cuenta
Saldo = Saldo - cantidad;
Faccin;
Pblico Funcin obtenerSaldo: Entero
// permite conocer el monto disponible o saldo de la cuenta
Retornar(saldo);
FFuncin;
FinClase CuentaBancaria

3
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

Encapsulamiento

El Encapsulamiento o encapsulacin es la propiedad que permite asegurar que el contenido de la i de un


objeto est oculta al mundo exterior: el objeto A no conoce lo que hace el objeto B, y viceversa. La
encapsulacin (tambin se conoce como ocultacin de la informacin), en esencia, es el proceso de
ocultar todos los secretos de un objeto que no contribuyen a sus caractersticas esenciales.
La encapsulacin permite la divisin de un programa en mdulos. Estos mdulos se implementan
mediante clases, de forma que una clase representa la encapsulacin de una abstraccin. En la prctica,
esto significa que cada clase debe tener dos partes: una interfaz y una implementacin. La interfaz de
una clase captura slo su vista externa y la implementacin contiene la representacin de la abstraccin,
as como los mecanismos que realizan el comportamiento adecuado.
Encapsulacin es la capacidad de contener y controlar el acceso a un grupo de elementos asociados. Las
clases proporcionan una de las formas ms comunes para encapsular elementos. En el siguiente
ejemplo, la clase BankAccount encapsula los mtodos, campos y propiedades que se describen en una
cuenta bancaria. Sin una encapsulacin, usted necesitara declarar procedimientos y variables por
separado para almacenar y administrar informacin para la cuenta bancaria, y sera difcil trabajar con
ms de una cuenta bancaria a la vez. La encapsulacin le permite utilizar los datos y procedimientos en
la clase BankAccount como una unidad. Usted puede trabajar con varias cuentas bancarias al mismo
tiempo sin confusin, debido a que cada cuenta est representada por una instancia nica de la clase.
La encapsulacin es muy conveniente y nos permite (Si programamos bien) colocar en funcionamiento
nuestro objeto en cualquier tipo de sistema, de una manera modular y escalable (algunas de las reglas
de la ingeniera del software).
Formas de encapsular
Abierto(public): hace que el miembro de la clase pueda ser accedido desde el
exterior de
la Clase cualquier parte del programa.
Protegido(protected): solo es accesible desde la Clase y las clases que heredan (a
cualquier
nivel).
Cerrado (private): Solo es accesible desde la Clases

La encapsulacin tambin le permite controlar la forma en que se utilizan los datos y los procedimientos.
Puede utilizar modificadores de acceso, como Private o Protected, para evitar que los procedimientos
externos ejecuten mtodos de clase o lean y modifiquen datos en propiedades y campos. Usted debe
declarar los detalles internos de una clase como Private para evitar que sean utilizados fuera de su clase;
a esta tcnica se le llama ocultamiento de datos. En la clase BankAccount, la informacin del cliente,
como el saldo de la cuenta, se protege de esta forma. Una de las reglas bsicas de la encapsulacin es
que los datos de la clase slo se pueden modificar o recuperar a travs de los procedimientos o mtodos
Property. Ocultar los detalles de implementacin de sus clases evita que se usen de maneras no
deseadas, y le permite modificar esos elementos posteriormente sin riesgo de tener problemas de
compatibilidad. Por ejemplo, versiones posteriores de la clase BankAccount enlistadas ms adelante,
podran cambiar el tipo de datos del campo AccountBalance sin peligro de daar la aplicacin que
depende de que este campo tenga un tipo de dato especfico.
Ejemplo
Cuando se crea una nueva clase en Java, se puede especificar el nivel de acceso que se quiere para las
variables de instancia y los mtodos definidos en la clase:

public

public void CualquieraPuedeAcceder(){}


Cualquier clase desde cualquier lugar puede acceder a las variables y mtodos de instancia pblicos.
protected

protected void SoloSubClases(){}

4
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

Slo las subclases de la clase y nadie ms puede acceder a las variables y mtodos de instancia
protegidos.
private

private String NumeroDelCarnetDeIdentidad;


Las variables y mtodos de instancia privados slo pueden ser accedidos desde dentro de la clase.
No son accesibles desde las subclases.
friendly (sin declaracin especfica)

void MetodoDeMiPaquete(){}
Por defecto, si no se especifica el control de acceso, las variables y mtodos de instancia se declaran
friendly (amigas), lo que significa que son accesibles por todos los objetos dentro del mismo
paquete, pero no por los externos al paquete. Es lo mismo que protected.

Modularidad :

La Modularidad es la propiedad que permite subdividir una aplicacin en partes ms pequeas (llamadas
mdulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicacin en s y de
las restantes partes.
La modularizacin consiste en dividir un programa en mdulos que se puedan compilar por separado,
pero que tienen conexiones con otros mdulos. Al igual que la encapsulacin, los lenguajes soportan la
Modularidad de diversas formas.
La Modularidad es la propiedad de un sistema que permite su descomposicin en un conjunto de
mdulos cohesivos y dbilmente acoplados. Por supuesto no todos los mdulos son iguales: tomar un
programa monoltico y separarlo de forma aleatoria en archivos no es ptimo. Se debe tener en cuenta
los conceptos asociados de dependencia, acoplamiento, cohesin, interfaz, encapsulacin y abstraccin.
Una vez identificado lo que es un buen mdulo, se puede contemplar la reutilizacin de un buen mdulo
como componente.
El Mdulo A depende del Mdulo B si cualquier cambio en el Mdulo B implica que el Mdulo A tambin
tenga que ser modificado. A veces se dice que el Mdulo A es un cliente del Mdulo B, o que el Mdulo B
acta como servidor del Mdulo A. En general, es normal que un mismo mdulo sea tanto cliente como
servidor. Esto significa, que depende de algunos mdulos, mientras que otros mdulos dependen de l.
Incluso es posible que un par de mdulos se tengan uno al otro de cliente; sin embargo, ste es un
ejemplo de dependencia circular, que debe evitarse cuando sea posible debido a que impide la
reutilizacin.
La dependencia a veces se conoce como acoplamiento. Un sistema con muchas dependencias tiene
fuerte acoplamiento. Los buenos sistemas tienen dbil acoplamiento, porque en ese caso los cambios en
una parte del sistema son menos probables de propagarse a travs del sistema.
Los mdulos correctos a menudo tienen la propiedad de que sus interfaces proporcionan una
abstraccin de algn elemento conocido de manera intuitiva que puede, no obstante, ser difcil de
implementar. Este tipo de mdulos se dice que tienen una fuerte cohesin. El mdulo realiza un
conjunto coherente de cosas, pero dentro de lo posible el desarrollador del cliente est protegido de la
informacin irrelevante relativa a cmo el mdulo hace lo que hace.
Resumiendo: Abstraccin es cuando un cliente de un mdulo no necesita saber ms de lo que hay en la
interfaz. Encapsulacin es cuando un cliente de un mdulo no es capaz de saber ms de lo que hay en la
interfaz.
Si un mdulo, de cualquier tamao y complejidad, es una buena abstraccin (tiene fuerte cohesin y
dbil acoplamiento) puede ser factible reutilizarlo en sistemas posteriores, o sustituirlo en el sistema
existente.

5
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

Ejemplo

PROGRAMA

Programa Principal
datos

Mdulo1 Mdulo2
Datos + Datos1 Datos + Datos2

Proced1 Proced2 Proced3

Jerarqua o Herencia

La Jerarqua es una propiedad que permite la ordenacin de las abstracciones. Las dos jerarquas ms
importantes de un sistema complejo son: estructura de clases (jerarqua es-un (is-a):
generalizacin/especializacin) y estructura de objetos (jerarqua parte-de (part-of): agregacin-
composicin).
Las jerarquas de generalizacin/especializacin se conocen como herencia. Bsicamente, la herencia
define una relacin entre clases, en donde una clase comparte la estructura o comportamiento definido
en una o ms clases (herencia simple y herencia mltiple, respectivamente).

Ejemplo
Deposito Persona

DepositoFijo DepositoAhorr
o

La composicin, es un tipo de relacin esttica por valor, el tiempo de vida del objeto est condicionado
por el tiempo de vida del lo incluye, por ejemplo almacn est compuesto por cuentas, el objeto base se
construir a partir del objeto incluido. Es una relacin por tipo de valor, se representa por un rombo
relleno. Si se borra el objeto almacn tambin se borra el objeto cuenta.

Ejemplo

public class Cuenta


{private int num;
private int saldo;
}
public class Almacen {
private Cuenta cuenta;..}

6
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

La agregacin es una relacin por referencia, de tipo dinmica, el tipo de vida del objeto incluido es
independiente del que lo incluye. El objeto base utiliza al incluido para su funcionamiento. Si se borra el
objeto almacn sigue existiendo el objeto cliente.

Ejemplo:

public class Cliente{


private String nombre;.}
public class Almacen {
private String direccion;
public String mensaje(Cliente cliente){
return Cliente en mora+cliente.getNombre();}}

Polimorfismo

La quinta propiedad significativa de los lenguajes de programacin orientados a objetos es el


polimorfismo. Es la propiedad que indica, literalmente, la posibilidad de que una entidad tome muchas
formas. En trminos prcticos, el polimorfismo permite referirse a objetos de clases diferentes mediante
el mismo elemento de programa y realizar la misma operacin de diferentes formas, segn sea el objeto
que se referencia en ese momento.

Por ejemplo, cuando se describe la clase mamferos se puede observar que la operacin comer es una
operacin fundamental en la vida de los mamferos, de modo que cada tipo de mamfero debe poder
realizar la operacin o funcin comer. Por otra parte, una cabra o una vaca que pastan en un campo, un
nio que se come un caramelo y un len que devora a otro animal, son diferentes formas que utilizan
diferentes mamferos para realizar la misma funcin (comer).

El polimorfismo adquiere su mxima expresin en la derivacin o extensin de clases, es decir, cuando se


obtiene una clase a partir de una clase ya existente, mediante la propiedad de derivacin de clases o
herencia.

El polimorfismo requiere ligadura tarda o postergada (tambin llamada dinmica), y esto slo se puede
producir en lenguajes de programacin orientados a objetos. Los lenguajes no orientados a objetos
soportan ligadura temprana o anterior (tambin llamada esttica), esto significa que el compilador
genera una llamada a un nombre especfico de funcin y el enlazador (linker) resuelve la llamada a la
direccin absoluta del cdigo que se ha de ejecutar. En POO, el programa no puede determinar la
direccin del cdigo hasta el momento de la ejecucin. Cuando se enva un mensaje a un objeto, el
cdigo que se llama no se determina hasta el momento de la ejecucin. El compilador asegura que la
funcin existe y realiza verificacin de tipos de los argumentos y del valor de retorno, pero no conoce el
cdigo exacto a ejecutar.

Ejemplo

package com.practica.polimorfismo;

import java.util.ArrayList;
import java.util.List;

public class CalcularOperacionesFigura {

public static void main(String[] args) {


OperacionesFigura of = new Triangulo(Triangulo, Azul, 15.0, 3.0);

7
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

OperacionesFigura of2 = new Circulo(Circulo, Verde, 12.3);


List<OperacionesFigura> lista = new ArrayList<OperacionesFigura>();
lista.add(of);
lista.add(of2);

calcularArea(lista);
}

public static void calcularArea(List<OperacionesFigura> listaOperacionesFiguras) {


for (OperacionesFigura of : listaOperacionesFiguras) {
System.out.println(Area es: + of.calcularArea());
System.out.println(Nombre es: + of.figura().getNombre());
System.out.println(Color es: + of.figura().getColor());
}
}

7. Algoritmos recursivos

El concepto de recursividad va ligado al de repeticin. Son recursivos aquellos algoritmos que,


estando encapsulados dentro de una funcin, son llamados desde ella misma una y otra vez, en
contraposicin a los algoritmos iterativos, que hacen uso de bucles while, do-while, for, etc.

Algo es recursivo si se define en trminos de s mismo (cuando para definirse hace mencin a s
mismo). Para que una definicin recursiva sea vlida, la referencia a s misma debe ser
relativamente ms sencilla que el caso considerado.

Ejemplo: definicin de n natural:

- el N 0 es natural
- El N n es natural si n-1 lo es.

Un mtodo recursivo es un mtodo que se llama a si mismo, directa o indirectamente.


Es una alternativa a la iteracin o repeticin. En cuanto a tiempo de computadora y uso de memoria
es menos eficiente, es una herramienta til para solucionar problemas de naturaleza recursiva.

Naturaleza de la recursividad

Un objeto es recursivo si figura en su propia definicin


Ejemplo:

1 para N = 0
1) N! =

N(N-1)! para N > 0

8
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

1 si N = 0 N = 1

2) fibonacci(N) =
fibonacci(N-1)+ fibonacci(N-2) si N > 1

Caracterstica de la recursividad
Siempre existe una forma de salir de la definicin.

En un algoritmo recursivo distinguimos como mnimo 2 partes:

a). Caso trivial; base o de fin de recursin:

Una condicin de salida que es la condicin que no produce otra autollamada. Es un caso donde el
problema puede resolverse sin tener que hacer uso de una nueva llamada a s mismo. Evita la
continuacin indefinida de las partes recursivas.

b). Parte puramente recursiva:

Una llamada a s mismo (recursiva); normalmente con el valor de los parmetros que cambian en
cada llamada. Relaciona el resultado del algoritmo con resultados de casos ms simples. Se hacen
nuevas llamadas a la funcin, pero estn ms prximas al caso base.

EJEMPLO

ITERATIVO:

int factorial( int n )


{
int res=1;
for(int 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));
}

9
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

TIPOS DE RECURSIN

Recursividad directa

O recursividad simple es aquella en cuya definicin slo aparece una llamada recursiva. Se
puede transformar con facilidad en algoritmos iterativos. Recursividad mltiple: Se da cuando
hay ms de una llamada a s misma dentro del cuerpo de la funcin, resultando ms difcil
de hacer de forma iterativa.

int fib( int n ) /* ej: Fibonacci */


{
if(n <= 1) return 1;
return(fib(n-1) + fib(n-2));
}

Recursividad anidada:

En algunos de los argumentos de la llamada recursiva hay una nueva llamada a s misma.

int ack( int n, int m ) /* ej: Ackerman */


{
if(n==0 ) return(m+1);
else if(m==0) return(ack(n-1,1));
return(ack(n-1, ack(n,m-1)));
}

Recursividad cruzada o indirecta:


Son algoritmos donde una funcin provoca una llamada a s misma de forma indirecta, a travs de
otras funciones.

Ej: Par o Impar:


int par( int nump )
{if(nump==0) return(1);
return( impar(nump-1));}
int impar( int numi )
{if(numi==0) return(0);
return( par(numi-1));}

LA PILA DE RECURSIN

La memoria del ordenador se divide (de manera lgica, no fsica) en varios segmentos (4):

10
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

Segmento de cdigo: Parte de la memoria donde se guardan las instrucciones del programa en
cdigo de mquina.
Segmento de datos: Parte de la memoria destinada a almacenar las variables estticas.
Montculo: Parte de la memoria destinada a las variables dinmicas.
Pila del programa: Parte destinada a las variables locales y parmetros de la funcin que est siendo
ejecutada.

Llamada a una funcin:

Se reserva espacio en la pila para los parmetros de la funcin y sus variables locales.
Se guarda en la pila la direccin de la lnea de cdigo desde donde se ha llamado a la funcin.
Se almacenan los parmetros de la funcin y sus valores en la pila.
Al terminar la funcin, se libera la memoria asignada en la pila y se vuelve a la instruccin actual.

Llamada a una funcin recursiva:

En el caso recursivo, cada llamada genera un nuevo ejemplar de la funcin con sus correspondientes
objetos locales:

La funcin se ejecutar normalmente hasta la llamada a s misma. En ese momento se crean


en la pila nuevos parmetros y variables locales. El nuevo ejemplar de funcin comienza a
ejecutarse.
Se crean ms copias hasta llegar a los casos bases, donde se resuelve directamente el valor,
y se va saliendo liberando memoria hasta llegar a la primera llamada (ltima en cerrarse)

Medicin de la eficacia de un algoritmo recursivo


Viene dada por:
1. Tiempo de ejecucin
2. Espacio de memoria ocupado por el algoritmo
3. Legibilidad y facilidad de comprensin

EJERCICIOS

a). Torres de Hanoi: Problema de solucin recursiva, consiste en mover todos los discos (de
diferentes tamaos) de una aguja a otra, usando una aguja auxiliar, y sabiendo que un disco no
puede estar sobre otro menor que ste.

Este es un problema matemtico bastante conocido para estudiantes de Ingeniera de sistemas,


ciencias computacionales, algoritmia, programacin, matemtica entre otros. En el problema se
encuentran tres varillas puestas verticalmente, y en una de ellas se encuentran un numero
determinado de discos ordenados de mayor a menor de forma ascendente, el nmero de discos
depende de la complejidad del problema. Para solucionar dicho ejercicio se deben pasar todos los
discos de una varilla a otra, de forma que queden ordenados igual que al comienzo (de mayor a
menor de manera ascendente) pero esto respetando algunas reglas:

1) Solo se puede mover un disco por vez.


2) Solo se podr mover el disco que quede arriba en cualquiera de las tres varillas.
3) Un disco ms grande no se puede ubicar encima de uno mas pequeo.

11
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

------------------------------------- A------- B-------- C

/* Solucion:
1- Mover n-1 discos de A a B
2- Mover 1 disco de A a C
3- Mover n-1 discos de B a C
*/
void Hanoi( n, inicial, aux, final )
{
if( n>0 )
{
Hanoi(n-1, inicial, final, aux );
printf("Mover %d de %c a %c", n, inicial, final );
Hanoi(n-1, aux, inicial, final );
}
}

b). Calcular x elevado a n de forma recursiva:

float xelevn( float base, int exp )


{
if(exp == 0 ) return(1);
return( base*xelevn(base,exp-1));
}

c). Multiplicar 2 ns con sumas sucesivas recursos:

int multi( int a, int b )


{
if(b == 0 ) return(0);
return( a + multi(a, b-1));
}

METODOS RECURSISVOS

Primero debemos decir que la recursividad no es una estructura de datos, sino que es una tcnica
de programacin que nos permite que un bloque de instrucciones se ejecute n veces. Remplaza en
ocasiones a estructuras repetitivas.

Este concepto ser de gran utilidad para el captulo de la estructura de datos tipo rbol.

12
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

La recursividad es un concepto difcil de entender en principio, pero luego de analizar diferentes


problemas aparecen puntos comunes.

En Java los mtodos pueden llamarse a s mismos. Si dentro de un mtodo existe la llamada a s
mismo decimos que el mtodo es recursivo.

Cuando un mtodo se llama a s mismo, se asigna espacio en la pila para las nuevas variables locales
y parmetros.

Al volver de una llamada recursiva, se recuperan de la pila las variables locales y los parmetros
antiguos y la ejecucin se reanuda en el punto de la llamada al mtodo.

Problema1 Implementacin de un mtodo recursivo.

Programa:

public class Recursividad {

void repetir() {
repetir();
}

public static void main(String[] ar) {


Recursividad re=new Recursividad();
re.repetir();
}
}

La funcin repetir es recursiva porque dentro de la funcin se llama a s misma.


Cuando ejecuta este programa se bloquear y generar una excepcin: "Exception in thread "main"
java.lang.StackOverflowError"
Analicemos como funciona:
Primero se ejecuta la funcin main, luego de crear un objeto llamamos a la funcin repetir.
Hay que tener en cuenta que cada vez que se llama a una funcin se reservan 4 bytes de la memoria
que se liberarn cuando finalice su ejecucin.
La primera lnea de la funcin llama a la funcin repetir, es decir que se reservan 4 bytes
nuevamente. Se ejecuta nuevamente una instancia de la funcin repetir y as sucesivamente hasta
que la pila esttica se colme y se cuelgue el programa.

Problema 2:

Implementacin de un mtodo recursivo que reciba un parmetro de tipo entero y luego llame en forma
recursiva con el valor del parmetro menos 1.

Programa

13
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

public class Recursividad {

void imprimir(int x) {
System.out.println(x);
imprimir(x-1);
}

public static void main(String[] ar) {


Recursividad re=new Recursividad();
re.imprimir(5);
}
}

Desde la main se llama a la funcin imprimir y se le enva el valor 5. El parmetro x recibe el valor 5.
Se ejecuta el algoritmo de la funcin, imprime el contenido del parmetro (5) y seguidamente se
llama a una funcin, en este caso a s misma (por eso decimos que es una funcin recursiva),
envindole el valor 4.
El parmetro x recibe el valor 4 y se imprime en pantalla el cuatro, llamando nuevamente a la
funcin imprimir envindole el valor 3.
Si continuamos este algoritmo podremos observar que en pantalla se imprime:
5 4 3 2 1 0 ?1 ?2 ?3 . . . . . . . . .
hasta que se bloquee el programa.
Tener en cuenta que cada llamada a una funcin consume 4 bytes por la llamada y en este caso 4
bytes por el parmetro x. Como nunca finaliza la ejecucin completa de las funciones se desborda la
pila esttica por las sucesivas llamadas.

8. ALGORITMO DIVIDE Y VENCERS


En la cultura popular, divide y vencers hace referencia a un refrn que implica resolver un
problema difcil, dividindolo en partes ms simples tantas veces como sea necesario, hasta que la
resolucin de las partes se torna obvia. La solucin del problema principal se construye con las
soluciones encontradas.
En las ciencias de la computacin, el trmino divide y vencers (DYV) hace referencia a uno de los
ms importantes paradigmas de diseo algortmico. El mtodo est basado en la resolucin
recursiva de un problema dividindolo en dos o ms subproblemas de igual tipo o similar. El proceso
contina hasta que stos llegan a ser lo suficientemente sencillos como para que se resuelvan
directamente. Al final, las soluciones a cada uno de los subproblemas se combinan para dar una
solucin al problema original.
Esta tcnica es la base de los algoritmos eficientes para casi cualquier tipo de problema como, por
ejemplo, algoritmos de ordenamiento (quicksort, mergesort, entre muchos otros), multiplicar
nmeros grandes (Karatsuba), anlisis sintcticos (anlisis sintctico top-down) y la transformada
discreta de Fourier.
Por otra parte, analizar y disear algoritmos de DyV son tareas que lleva tiempo dominar. Al igual
que en la induccin, a veces es necesario sustituir el problema original por uno ms complejo para
conseguir realizar la recursin, y no hay un mtodo sistemtico de generalizacin.
El nombre divide y vencers tambin se aplica a veces a algoritmos que reducen cada problema a un
nico subproblema, como la bsqueda binaria para encontrar un elemento en una lista ordenada (o
su equivalente en computacin numrica, el algoritmo de biseccin para bsqueda de races). Estos
algoritmos pueden ser implementados ms eficientemente que los algoritmos generales de divide
y vencers; en particular, si es usando una serie de recursiones que lo convierten en simples
bucles. Bajo esta amplia definicin, sin embargo, cada algoritmo que usa recursin o bucles puede

14
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

ser tomado como un algoritmo de divide y vencers. El nombre decrementa y vencers ha sido
propuesta para la subclase simple de problemas.
La correccin de un algoritmo de divide y vencers, est habitualmente probada una induccin
matemtica, y su coste computacional se determina resolviendo relaciones de recurrencia.

15
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

Semana 4
PRIMERA UNIDAD

Competencias

Reconocimiento de las diferencias entre estructuras estticas y dinmicas


Aplicar tipos de datos de acuerdo a la complejidad.
Manipular operaciones en las estructuras internas

Contenido

Estructuras estticas fundamentales: lgico, carcter, entero y punto flotante

Estructuras estticas compuestas: Arreglos. Arrays multidimensionales. Utilizacin de arrays como parmetros
cadenas(declaracin inicializacin, asignacin. Mtodos y operador + con cadenas. Clase vector

Lgico
Mapa Conceptual
Fundamentale
s
Carcte
r

Entero

ESTRUCTURAS ESTATICAS

Punto
Flotante

Conjuntos

Compuestas

Arreglos

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

ESTRUCTURAS DE DATOS ESTATICAS

1. ESTRUCTURAS DE DATOS FUNDAMENTALES


a. ENTERO
Desde un nivel lgico
Es uno de los conceptos fundamentales de cualquier lenguaje de programacin. Estos definen los
mtodos de almacenamiento disponibles para representar informacin, junto con la manera en
que dicha informacin ha de ser interpretada.
Desde un nivel de implementacin
Para crear una variable (de un tipo simple) en memoria debe declararse indicando su tipo de
variable y su identificador que la identificar de forma nica. La sintaxis de declaracin de
variables es la siguiente:

TipoSimple Identificador1, Identificador2;

Esta sentencia indica al compilador que reserve memoria para dos variables del tipo simple
TipoSimple con nombres Identificador1 e Identificador2

En java se representa Se usan para representar nmeros enteros con signo. Hay cuatro tipos:
byte, short, int y long.

Tipo Tamao Rango


byte 1Byte (8 bits) -128 a +127
short 2 Bytes (16 bits) -32767 a +32766
int 4 Bytes (32 bits) -2147483648 + 2147483647
long 8 Bytes (64 bits) -9223372036854775808 a
+9223372036854775808

Desde un nivel de aplicacin


Desde este punto de vista los enteros se utilizan para poder almacenar datos y su aplicacin een
los diferentes programas.

Ejemplo1

public class Ejemplo1{


public static void main(String [] args){
//declaramos variables
int n1, n2,n3;
int suma;
//inicializacin de variables
n1=54200;
n1=67867
//proceso
suma=n1+n2;
System.out.println(la suma es :+suma;
}}

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

b. LOGICO

Desde un nivel lgico

Se usa para almacenar variables que presenten dos estados, que son representados por los
valores true y false. Representan valores en bi-estado, provenientes del lgebra de Boole

Desde un nivel de implementacin

Java utiliza dos palabras clave para los estados: true (para verdadero) y false (para falso). Este
tipo de literales es nuevo respecto a C/C++, lenguajes en los que el valor de falso se
representaba por un 0 numrico, y verdadero cualquier nmero que no fuese el 0.

Para declarar un dato del tipo booleano se utiliza la palabra reservada boolean:

boolean reciboPagado = false; // Aun no nos han pagado?!

Desde un nivel de aplicacin


Desde este punto de vista los enteros se utilizan para poder almacenar datos y su aplicacin es
los diferentes programas

Ejemplo2

public class Ejemplo2 {


public static void main(String[] args) {
boolean ban;
byte numero,sumatoria;
sumatoria=0;
ban=true;
while(true==ban)
{
System.out.println("Ingresar un numero ");
Scanner Leer=new Scanner(System.in);
numero=Leer.nextByte();
sumatoria=(byte) (sumatoria+numero);
System.out.println("Desea seguir true / false");
Scanner Leer1=new Scanner(System.in);
ban=(boolean)Leer1.nextBoolean();
}
System.out.println("La sumatoria es "+sumatoria);
}
}

c. CARCTER
Desde un nivel lgico

Se usa para almacenar caracteres Unicode simples. Debido a que el conjunto de caracteres
Unicode se compone de valores de 16 bits, el tipo de datos char se almacena en un entero sin
signo de 16 bits.

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

Desde un nivel de implementacin

Java a diferencia de C/C++ distingue entre matrices de caracteres y cadenas.

Representan un nico carcter (de la tabla de caracteres Unicode 1.1) y aparecen dentro de un par
de comillas simples. De forma similar que en C/C++. Los caracteres especiales (de control y no
imprimibles) se representan con una barra invertida ('\') seguida del cdigo carcter.

Descripcin Representacin Valor Unicode


Caracter Unicode \udddd
Numero octal \ddd
Barra invertida \\ \u005C
Continuacin \ \
Retroceso \b \u0008
Retorno de carro \r \u000D
Alimentacin de formularios \f \u000C
Tabulacin horizontal \t \u0009
Lnea nueva \n \u000A
Comillas simples \ \u0027
Comillas dobles \" \u0022
Nmeros arbigos ASCII 0-9 \u0030 a \u0039
Alfabeto ASCII en maysculas A.-Z \u0041 a \u005A
Alfabeto ASCII en minsculas a.-z \u0061 a \u007A
Desde un nivel de aplicacin

Desde este punto de vista los caracteres se utilizan para poder almacenar letras y su aplicacin
se encuentra en los diferentes programas.

Ejemplo3

public class Ejemplo3 {


public static void main(String[] args) throws IOException {
char caracter1, caracter2;
System.out.println("Ingrese un caracter");
caracter1=(char)System.in.read();
System.in.read();
System.out.println("Ingrese otro caracter");
caracter2=(char)System.in.read();
if(caracter1==caracter2)
System.out.println("Los caracteres ingresados son iguales");
else
System.out.println("Los caracteres ingresados no son iguales");
}
}

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

d. PUNTO FLOTANTE

Desde un nivel lgico

Se usan para representar nmeros con partes fraccionarias Hay dos tipos de coma flotante: float y
double. El primero reserva almacenamiento para un nmero de precisin simple de 4 bytes y el
segundo lo hace para un nmero de precisin doble de 8 bytes

Tipo Tamao
Float 4 Byte (32 bits)
double 8 Bytes (64 bits)

Desde un nivel de implementacin


La declaracin de variables de coma flotante es muy similar a la de las variables enteras. Por
ejemplo:

double miPi = 314.16e-2 ; // Aproximadamente

float temperatura = (float)36.6; // Paciente sin fiebre

Desde un nivel de aplicacin


Desde este punto de vista los enteros se utilizan para poder almacenar datos y su aplicacin es
los diferentes programas.

Ejemplo4
public class Ejemplo4 {
public static void main(String[] args) {
float numero1,numero2;
System.out.println("Ingrese un nmero decimal ");
Scanner Leer=new Scanner(System.in);
numero1=(float)Leer.nextFloat();
System.out.println("Ingrese otro nmero decimal");
numero2=(float)Leer.nextFloat();
System.out.println("La divisin de los dos nmero es "+numero1/numero2);
}
}

2. ESTRUCTURAS DE DATOS COMPUESTAS


a. ARRAYS
i. ARRAYS UNIDIMENSIONAL

Desde un nivel lgico

Un arreglo o arrays es una coleccin finita de tamao fijo y de elementos homogneos y


ordenados

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

El array es una estructura de acceso directo o aleatorio .Se accede directamente al elemento
de una array a travs del ndice de seleccin.

Las operaciones bsicas son :

Constructor

Selector

Extraer el valor

Modificar el valor

Operaciones Complejas

Ordenamiento, bsquedas y mezclas.

Desde un nivel de implementacin

En java un array es un grupo de variables que tienen en mismo nombre, los elementos estn
almacenados en posiciones continuas en memoria, que estos a su vez se diferencia por el
ndice.

TipoDeDato [ ] nombreArray;

nombreArray=new TipoDeDato[ numeroElementos];

int [ ] conjuntoEnteros=new int[5 ];

int[] numeros={2, -4, 15, -25};

Almacenamiento en Memoria

El array se almacena en posiciones consecutivas de memoria. A la variable referencia se le


asocia la direccin del primer elemento del array, denominado direccin base.

La cantidad de espacio que se requiere para almacenar un array

tamaoFisicoArray=numeroElementos * p

p=numero de byte necesarios npara almacenar un elemento de tipoBase

conjuntoEntero

0
1
2
3
5

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

Desde un nivel de aplicacin

Es una estructura natural para modelar listas de elementos de datos iguales, es fcil de
recorrer, buscar y ordenar, algunos ejemplos pueden ser una lista de palabras o comandos, etc.

Ejemplo5
public class Ejemplo5 {
public static void main(String[] args) {
byte cantNotas, totalNotas=0;
byte[] notas;
System.out.println("Ingrese la cantidad de notas");
Scanner Leer=new Scanner(System.in);
cantNotas= (byte)Leer.nextByte();
notas=new byte[cantNotas];
System.out.println("Ingrese notas\n");
for(int i=0; i<cantNotas; i++)
{System.out.print("nota["+i+"]"+"=");
notas[i]=(byte)Leer.nextByte();
}
for(int i=0;i<cantNotas;i++){
totalNotas=(byte) (totalNotas+notas[i]);
}
System.out.println("El promedio de notas es "+totalNotas/cantNotas);
}
}

ii. ARRAYS MULTIDIMENSIONAL

Desde un nivel lgico

Llamados tambin matrices, es un array cuyos elementos son tambin arrays y se maneja a
travs de dos ndices.
Sus operaciones bsicas son el constructor y selector.
El arrays multidimensional ms comn es el que tiene 2 dimensiones es decir las matrices.

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

Desde un nivel de implementacin

En Java presenta una matriz, es un arrays de arrays, para lograr almacenar los datos en este tipos
de estructura estn dispuestos en filas y columnas. La identificacin un elemento es necesario
identificar sus dos ndices.

tipoDato [ ] [ ] nombreMatriz;
nombreMatriz=new tipoDato[ 3] [ 3];

int [][] m = new int[3][3];


m[0] = new int[3];
m[1] = new int[5];
m[2] = new int[2];

Ingreso esttico de los elementos de una matriz

int [ ][ ] numeros = {{6,7,5}, {3, 8, 4}, {1,0,2}, {9,5,2}};

Desde un nivel de aplicacin

Se utilizan en muchas aplicaciones que requieran tablas.

Ejemplo6

public class Ejemplo6 {

public static void main(String[] args) {


byte matriz[][]=new byte[3][3];
byte numeMayor=0;
Scanner Leer=new Scanner(System.in);
System.out.println("Ingrese elementos de una matriz \n");
for(int i=0; i<matriz.length;i++)
for(int j=0; j<matriz.length;j++)
{System.out.println("matriz["+i+"]["+j+"]");
matriz[i][j]=(byte)Leer.nextByte();
}
for(int i=0; i<matriz.length;i++)
for(int j=0; j<matriz.length;j++)
{
if(numeMayor<matriz[i][j])
numeMayor=matriz[i][j];
}
System.out.println("El nmero mayor de la matriz es "+numeMayor);
}
}

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

b. CONJUNTOS

Desde un nivel lgico

Es una coleccin no ordenada de miembros o elementos de un determinado tipo

Las operaciones bsicas son: el constructor y selector.

Las operaciones complejas son: permanencia, unin, interseccin, diferencia, complemento,


inclusin e igualdad.

Desde un nivel de implementacin

Java no tiene ninguna clase o interfaz que se pueda implementar estructuras con el
comportamiento de un conjunto, en consecuencia se puede utilizar la interfaz java.util.set como
base para implementacin de un conjunto.

Set: Dentro de las colecciones de datos que java proporciona en su biblioteca bsica,
est la interfaz set que recoge los conjuntos de datos que se caracterizan porque:
no se respeta el orden en el que se insertan elementos
no pueden haber elementos duplicados
el tamao del conjunto se adapta dinmicamente a lo que haga falta

Mtodos de la interface

interface Set <E>

boolean add(E elemento)


aade un elemento al conjunto, si no estaba ya;
devuelve true si el conjunto crece
void clear()
vaca el conjunto
boolean contains(E elemento)
devuelve true si existe en el conjuto algn elemento equals al indicado
boolean equals(Object x)
devuelve true si uno y otro conjunto contienen el mismo nmero de
elementos y los de un conjunto son respectivamente equals los del otro
boolean isEmpty()
devuelve true si el conjunto est vaco
Iterator <E> iterator()
devuelve un iterador sobre los elementos del conjunto
boolean remove(E elemento)
si existe un elemento equals al indicado, se elimina;
devuelve true si vara el tamao del conjunto
int size()
nmero de elementos en el conjunto

El propio paquete java.util proporciona algunas implementaciones de la interface Set, sin


perjuicio de que se puedan programar otras.

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

class HashSet implements Set


Es una implementacin muy eficiente en cuanto a uso de memoria. Es rpida en todas las
operaciones.
class TreeSet implements Set
Es una implementacin ms lenta y pesada; pero presenta la ventaja de que el iterador
recorre los elementos del conjunto en orden.
Ejemplo

Set <Integer> conjunto = new HashSet <Integer>();

conjunto.add(1);
conjunto.add(9);
conjunto.add(5);
conjunto.add(9);
System.out.println(conjunto.size());
for (int n: conjunto) {
System.out.print(n + " ");
}
System.out.println();

Desde un nivel de aplicacin

Su aplicacin est en la implementacin de estructuras que contengan elementos no repetidos,


tambin se ve en la implantacin de un compilador de un lenguaje de programacin.

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

Semana 6-7
PRIMERA UNIDAD 2

Competencias

Reconocimiento de las diferencias entre estructuras estticas y dinmicas


Aplicar tipos de datos de acuerdo a la complejidad.
Manipular operaciones en las estructuras internas

Contenido

Estructuras dinmicas lineales: listas. Fundamentacin. Clasificacin de listas enlazadas. Listas simples y operaciones.
Insercin de un elemento en una lista. Bsqueda en listas enlazadas. Eliminacin de un nodo en una lista. Lista ordenada.

Listas enlazadas
Mapa Conceptual
Lineales

Operaciones

Pilas

ESTRUCTURAS
DINAMICAS LINE
Colas

No lineales

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

ESTRUCTURA DE DATOS DINAMICAS LINEALES

1. LISTAS ENLAZADAS
Es una coleccin de elementos enlazados dispuestos uno detrs de otros en la que cada elemento
se conecta al siguiente, la idea es tener un conjunto de elementos llamados nodos, en las cuales
contienen la direccin de un nodo y el elemento almacenado. As como se muestra en la siguiente
figura

2. CLASIFICACION DE LAS LISTAS ENLAZADAS


a. Listas simplemente enlazadas

primero

b. Listas doblemente enlazadas


primero

c. Listas circular simplemente enlazadas

primero

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

d. Listas circularmente enlazadas


primero

3. ESPECIFICACIN FORMAL DE UN TAD (tipo de dato abstracto) DE UNA


LISTA
Matemticamente una lista es una secuencia de elementos de un determinado tipo de elemento:
(a1,a2,a3,a4..an) donde n= 0
Si n=0 lista es vaca
Para formalizar el tipo de dato abstracto de una lista a partir de la notacin matemtica, se define un
conjunto de operaciones bsicas con objetos de tipo lista las operaciones son:

L Lista x Lista p referencia

listaVacia (L)
esvacia(L)
insertar(L,x,p)
localizar(L,x)
suprimer(L,x)
anterior(L,p)
primero(L)
anula(L)
insertarPrimero(L,x)
insertarFinal(L,x)

La operacin de una estructura de datos es recorrer, consiste en visitar cada nodo de la lista.

4. OPERACIONES EN LISTAS ENLAZADAS

La implementacin del TAD de una lista requiere, primer lugar declarar la clase nodo, en las que se
combinaran sus dos partes: el dato y un enlace (referencia). A dems la clase lista con sus
operaciones y el atributo con la cabeza de la lista. Las operaciones tendrn las siguientes
operaciones:
Inicializacin o creacin
Insertar un elemento en la lista
Remover elemento de una lista
Buscar elemento de una lista
Recorrer la lista
Comprobar lista vaca

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

4.1 Declaracin de un nodo

Una lista enlazada se compone de nodos enlazadas por consiguiente de la declaracin de la misma
seria de la siguiente manera:

primero

public class Nodo <Tipo> {


Tipo dato;
Nodo siguiente;
public Nodo(Tipo dato) {
this.dato=dato;
siguiente=null;
}
}

4.2 Declaracin de un nodoDoble

Una lista doble se compone de nodos enlazados por los nodos anteriores y posteriores, por
consiguiente la declaracin sera de la siguiente manera:

primero

public class NodoD <Tipo> {


Tipo dato;
NodoD anterior,siguiente;
public NodoD(Tipo dato) {
this.dato=dato;
anterior=siguiente=null;
}
}

4.3 Declaracin de un nodoCircular


Una lista circular se compone de nodos enlazados en donde el ltimo nodo esta enlazado con el
primer nodo de la listapor consiguiente la declaracin sera de la siguiente manera:

primero

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

public class NodoC <Tipo> {


Tipo dato;
NodoC siguiente;
public NodoC(Tipo dato) {
this.dato=dato;
siguiente=this;
}
}

4.4 Declaracin de un nodoCirsularDoble


Una lista circular doble se compone de nodos enlazados en donde el ltimo nodo esta enlazado con
el primer nodo y el primer nodo tiene el enlace del ltimo nodo de la lista de la lista, por consiguiente
la declaracin sera de la siguiente manera

primero

class NodoDC <Tipo> {


Tipo dato;
NodoDC anterior siguiente;
public NodoC(Tipo dato) {
this.dato=dato;
anterior=siguiente=this;
}
}

5 Construccin de una Lista Simple


La creacin de una lista implica, relacionar la implementacin de un nodo, como se ya ha definido en
el concepto anterior.

La clase Lista define el atributo primero, referencia a un Nodo, para acceder a los elementos de la
lista. Para construir la lista se inicializara definiendo una lista vaca, con la referencia primero debe
de apuntar a nulo.

Inicializando Lista

primero

primero=null;

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

Insertando un elemento a lista vaca


Se crea el nodo

nuevo

Nodo nuevo =new Nodo ();

Luego, como la lista esta vaca se hace que la referencia primero apunte al nuevo nodo creado

primero

nuevo

primero=nuevo

En consecuencia la lista quedara

primero

Se desea seguir ingresando un elemento ms, segn el algoritmo se crea el nuevo nodo

nuevo

Nodo nuevo =new Nodo ();

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

La lista tiene la siguiente figura

primero

nuevo

nuevo.siguiente=primero
primero=nuevo

a continuacin la lista quedara as :

primero

Tambin se puede insertar un elemento en cualquier posicin de la lista, para este caso igual se
crea un nodo, se inicializa un nodo aux

aux

primero

nuevo

nuevo.siguente=aux
primero.siguiente=nuevo

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

Otro caso puede ser que se inserte un elemento al final de la lista

aux

primero

nuevo

aux.siguente=nuevo

Otra de las operaciones dentro de una lista es buscar un elemento, para esto se utiliza una
referencia que se inicializa en primero y se busca el elemento dentro de la lista, lo que devuelve la
operacin es la referencia o un valor lgico, dependiendo del requerimiento.

aux

primero

aux=primero
while(aux.dato!=datoB) && (aux.siguiente!=null)
axu=aux.siguiente

Remover un nodo dentro de una lista sera equivalente a decir eliminar un elemento e de la lista, en
consecuencia se puede implementar de varias formas, remover el primer elemento de la lista,
remover el ltimo de la lista, remover elemento buscado, remover un elemento antes de una posicin
o despus de una posicin, estas operaciones se implementan de acuerdo a los requerimientos. A
continuacin tenemos remover por el primero.

aux

primero

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

primero = aux.siguiente

Remover el elemento que esta al final de la lista aux

primero

aux.siguiente=null

Remover un elemento buscado, imaginemos que el elemento buscado esta apuntado por la
referencia aux2, se debe de trabajar con aux1 para no perder las referencias, recomienda que la
referencia primero siempre debe de apuntar al primer elemento de la lista.

aux1 Aux2

primero

aux1=aux2.siguiente
aux2=null

Package Lista;
public class Lista <Tipo> {
Nodo primero;
public Lista() {
primero=null;
}
public Lista insertar(Tipo x){
Nodo nuevo=new Nodo(x);
if (primero!=null )
nuevo.setSiguiente(primero);
primero=nuevo;
return this;
}
public String toStream(){
String salida="";
Nodo actual;
for(actual=primero; actual!=null; actual=actual.getSiguiente() )

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017
Universidad Nacional de San Cristbal de Huamanga IS241-Estructura de datos

salida=salida+actual.getDato();
return salida;
}
public Lista Eliminar(){
Nodo actual=primero;
if (primero!=null )
primero=actual.getSiguiente();
return this;
}
}
package Lista;
public class DemoLista {
public static void main(String[] args) {
Lista lc=new Lista();
lc.insertar( new Integer(4));
lc.insertar( new Integer(5));
lc.insertar( new Integer(6));
lc.insertar( new Integer(10));
System.out.println(lc.toStream());
lc.Eliminar();
System.out.println(lc.toStream());
}
}
}

Escuela de Formacin de Ingeniera de Sistemas


Docente Ing. Elinar Carrillo Riveros ao 2017

Das könnte Ihnen auch gefallen