viernes, 25 de octubre de 2013

Colas circular

Colas circular y Recursividad.

Figura numero 10
Para  implementar una cola circular  debemos realizar unos cambios en la clase cola para el método de llena, y los metodos como poner y quitar. las modificaciones son:

llena: (frente==0&& fin==max-1)||(fin==frente-1)

poner: if(fin==max-1){
fin =0;
} else {
fin++;
}

quitar: if(frente==max-1){
frente =0;
} else {
frente++;
}

En la figura numero 10 se ilusta una cola circular con una variable v (vector) que apunta al objeto, el circulo que tiene la flecha tiene como obnjetivo mostrar en que sentido se va insertando en la cola.

Recursividad 

1. Definicion: propiedad de las funciones (metodos) de autollamarse, se constituye una alternativa de los procesos iterativos (for, while, do while).

2. Utilidad: cuando el proceso o solucion iterativa es compleja.

3. Aplicaciones: recorrido de estructuras no lineales, en algunas formulas matematicas.

4.    Recursividad Vs Iteracion.
Recursividad
Iteración
métodos
ciclos
Reducción de código máxima
Reducción de código mínima
Lógica simple
Puede ser muy complejo
Considerable consumo de memoria
Consumo mínimo de memoria

Apreciacion importante y reflexion.

La recursividad consume mas memoria por que en cada autollamado hace una copia de toda la funcion y es guardada el la pila para llamado a subprogramas.

Tener muy en cuenta que siempre que se pueda usar un algoritmo no recursivo resultaria mejor ya que se ejecuta mas rapidamente y ocupa menos memoria ram  .

jueves, 24 de octubre de 2013

Solucion Parcial Numero dos.


Solución Parcial Numero dos.

Figura numero 9

En el parcial realizado el día miércoles 16 de octubre año 2013 se evaluaron dos punto uno sobre cola y otro sobre pila.
primer punto : Desarrolle una función Java, para intercambiar los elementos de los extremos en una cola. solo se puede usar colas y variables simples, primitivas, Object y envolventes.

Solución.

public static void intercambiarExtremos(Cola c){
Object aux1;
Object aux2=null;
Cola <Object> q = new Cola<>();
aux1=c.quitar();
while(!c.vacia()){
aux2=c.quitar();
if(!c.vacia()){
q.poner(aux2);
}
}
c.poner(aux2);
while(!q.vacia()){
c.poner(q.quitar());
}
c.poner(aux1);
}

Segundo punto: Defina la clase Pila en base a la clase Lista.

public class PilaLista <T>{
Lista<T> l = new Lista ();
public PilaLista() {
}
public boolean vacia(){ return l.vacia(); }
public void poner(T dato){
l.insertarInicio(dato, null);
}
public T cima(){ l.reiniciar();
T dat = null;
if(!vacia()){
dat = l.infor();
} else {
System.out.println("Pila Vacia");
}
return l.infor();
} 
public T quitar(){
l.reiniciar();
T date = null;
if(!vacia()){
date = l.infor();
l.eliminar();
} else {
System.out.println("Pila Vacia");
}
return date;
}

public static void main (String ae []){
PilaLista <String> pl = new PilaLista();
pl.poner("Carlos");
pl.poner("jose");
pl.poner("mendoza");
pl.poner("torres");
pl.poner("Estudiante");
pl.poner("Sistema");
pl.poner("Informacion");

System.out.println("cima ->" + pl.cima());

while(!pl.vacia()){
System.out.print(" "+pl.quitar());
}
System.out.println();

}

Apreciaciones importantes y reflexión:

en el primer punto  declaramos dos variables de tipo Objecto una que guardara el primer dato que se encuentra en la cola, la otra guardara el ultimo dato que se encuentra en la cola, también es necesario una cola auxiliar que guardara los datos intermedios, se saca el primer dato cuando se realiza la siguiente instrucción aux1=c.quitar(); luego los demás datos son sacados mediante una estructura repetitiva guardándolos primero en la segunda variable auxiliar y  se va preguntando si la cola no se encuentra vacía en caso de que se cumpla se pone en q los datos que se van sacando.
cuando termina de sacar los datos la variable aux2 almacena en ella el ultimo dato y es almacenado inmediatamente en la cola original, se ponen los datos intermedios y por ultimo se coloca el dato que almacena aux1 que era el primero ahora pasara de ultimo.

En el segundo punto se mostró una pila en base a la clase lista, lo cual era una actividad que se dejo para afianzar en nuestro estudio.

Colas

Colas.

Figura numero 9

Es una regla que restringe las operaciones en las estructuras lineales a FIFO(First In First Out) primer elemento en ser almacenado, primero en ser procesado.

Utilidad: su utilidad es cuando los recursos que se requieren para un proceso están en menor cantidad que la demanda de uso de estos.

aplicaciones: cola de procesos, cola de impresión, simulación.

Operaciones: Básicas: poner y quitar.

 Auxiliares: vacía, llena.

Implementacion: Arreglos, Nodo/lista.

Arreglo: Para realizar la implementacion con arreglos es necesario declarar cuatro variables una vector  y tres de tipo int llamadas max, frente, fin. Los métodos son los siguientes:
poner: fin++;
              v[fin]=dato;
quitar: dato = v[frente];
                      frente++;
vacia: frente==-1;
llena fin==max-1;

Nodo: Para realizar la implementacion con nodo también es necesario declarar nada mas las  variables frente y fin, pero estas serán de tipo Nodo.
poner: fin.setSig(new Nodo(dato,null));
          fin = fin.getSig();
quitar: dato=frente.getDato();
          frente = frente.getSig();
vacía: frente==null;

En la Figura numero 9 se muestra gráficamente un vector comportase como una cola tenemos la variable v (vector), una variable de tipo int llamada max con una valor de 6 que es el valor total del vector, es necesario otra variable de tipo int llamada frente esta tendrá la función de tener la posición en que se encuentra el primer dato de la cola, y otra variable  también de tipo int con nombre fin que tendrá la posición del ultimo dato que se encuentra en la cola.

Apreciaciones importantes y reflexión:

se obtuvo habilidad para realizar la clase ColaVector porque al conocer la clase pila se facilito la enseñanza de esta nueva estructura de datos, y conocer las operaciones básicas que en ella se utilizan. 

Aplicacion de Pila. Expresiones Aritmeticas

Aplicación de Pila. Expresiones Aritméticas


Una de las aplicaciones de pila son las expresiones aritméticas  estas facilitan la evaluación quitando paréntesis y ordenando el orden de operación según  prioridad al hacer la evaluación. Existen expresiones Aritméticas como:

inflija: son las expresiones que tienen el operador en el medio.

prefija: son las que tienen el operadores antes.

posfija: son las que tienen el operadores después.

Para realizar la aplicación de las expresiones aritméticas en pila es necesario pasar las expresiones inflijas a  prefijas y posfija. 
para realizarlo se guarda en una pila los operando  al encontrar un operador se sacan de la pila dos operando se realiza la operación y se guarda en la pila el resultado como se muestra en la figura numero 8.

Figura numero 8

Ejercicio de Expresiones Aritméticas conversión de inflijas a prefijas y posfijas. 
1. a+b*c^1/2 
Para convertir cualquier expresión aritmética inflija a prefija se necesita conocer sobre cual operador tiene mas prioridad cuales tienen iguales y cual tiene menor prioridad, al momento de convertir si nos encontramos con dos operadores que tienen iguales prioridades se realiza primero el operador que este mas a la izquierda, conociendo esto pasaremos a la conversión.
prefijas 

a+b*^c1/2   se paso el operador de el exponente ya que tiene mas prioridad de todos los operadores  y como la vamos a convertir a prefija se pasa el operador adelante de c.
a+*b^c1/2
a+/*b^c12
+a/*b^c12 resultado.
  posfijas
a+b*c^1/2  
a+b*c1^/2
a+bc1^*/2  
abc1^*2/+ resultado.

Ejercicios lógica de pilas

Función o métodos para:

1. Eliminar el primer elemento.
2.  Intercambiar los elementos de los extremos.
3. Eliminar elementos repetidos en forma consecutiva.

Métodos:

1.  

public void eliminarPrimero(Pila p){
T d = null;
d=((T) p.quitar());
while(!p.vacia()){
System.out.println(p.quitar());
}
}

2.  

public static void intercambiarElementosExtremos(Pila p){
Pila q,r;
q=new Pila <> ();
q.poner(p.quitar());
r= new Pila();
while(!p.vacia()){
r.poner(p.quitar());
}
p.poner(q.quitar());
q.poner(r.quitar());
while(!r.vacia()){
p.poner(r.quitar());
}
p.poner(q.quitar());

}

3. 

public static void eliminarRepetidoConsecutivo(Pila p){
Pila q = new Pila ();
q.poner(p.quitar());
while(!p.vacia()){
if(!p.cima().equals(q.cima())){
q.poner(p.quitar());
} else {
p.quitar();
}
}
while (!q.vacia()){
p.poner(q.quitar());
}
}

Apreciaciones importantes y reflexión:

En el primer metodo Se recibe la pila en la cual vamos a eliminar el primer elemento, se define una variable que recibira el dato que se quiere eliminar, luego se quita de la pila  cual elemento es el primero. Después de haber hecho esto  se imprimen los demás datos con una estructura repetitiva while.

En el segundo método  tambien se recibe una pila en la cual se cambiaran los elementos del extremo, se definen dos pilas que serviran de auxiliares llamadas q y r,  se quita el primer dato y se guarda en la pila q, luego se guradan los datos que quedan de la pila original a la otra pila auxiliar r, se guarda el dato que se encuentra en la pila q a la pila original p, luego es guardado el primer valor que se encuentra en la pila r a la pila q, se guardan los demas daos en la pila original, y es guardado también el dato que se encuentra en la pila r el cual anteriormente era el ultimo ahora es el primero.  

En el tercer método se tuvo en cuenta declarar una pila que sirve de auxiliar y tambien se recibe una pila, se saca el primer dato que trae la pila que recibe el metodo,  mediante un while se van sacando los demas datos, se va preguntando si el elemento que se saco es diferente al que esta en  la cima del original en caso de que esto se cumpla se pone en la pila q lo que va sacando de p, en caso de que no se cumpla se quita de la pila p y ese dato eliminado  automáticamente, luego se vuelve a mandar los datos en la forma que estaban a la pila original. 

Implementacion de Pila

 Implementacion de Pila.

1. Arreglos: Para realizar la implementacion de una pila por medio de arreglos es necesario definir tres variables las cuales son el vector de clase T (Genérico) y dos variables de clase int las cuales son el máximo y  tope. Se puede realizar operaciones como, poner, quitar, cima, vacía, llena. A continuación la clase PilaVector.

public class Pila <T>{
private T v[];
private int tope, max;
public Pila(){
max = 100;
v = (T[]) new Object[max];
tope = -1;
}
public Pila(int max){
this.max = max;
v = (T[]) new Object[max];
tope = -1;
}
public boolean vacia(){
return tope == -1;
}
public boolean llena(){
return tope == max-1;
}
public void poner(T dato){
if(!llena())
v[++tope] = dato;
else
System.out.println("La Pila Esta Llena");
}
public T quitar(){
T dato = null;
if(!vacia())
dato = v[tope--];
else
System.out.println("La Pila Esta Vacía");
return dato;
}
public T cima(){
if(!vacia())
return v[tope];
else
return null;
}


2. Nodos: Para la implementacion con Nodos se pueden realizar los siguientes métodos.

poner: tope = new Nodo(dato,tope);
quitar: dato = tope.getDato();
  tope= tope.getSig();
cima: dato=tope.getDato();
vacia: tope==null;

Apreciaciones importantes y reflexión: 

Aprendimos en la clase vista lo forma correcta de hacer que un vector se comporte como una pila, y resulta la clase mas funcional porque sirve para cualquier tipo de dato que se quiera guardar.


Introducción a Pila en Java.

Introducción a Pila en Java.

Figura numero 7

En la clase del día 12/09/2013, aprendí sobre lo que era una pila, es una regla que se aplica a las estructuras de datos lineales, restringiendo sus operaciones a LIFO (Last In First Out ) ultimo elemento almacenado,  primero en ser procesado.

Utilidades: Es utilizado cuando se quiere invertir, retroceder en un proceso donde quedan tareas pendientes por completar.

Aplicaciones:  Llamadas a subprogramas, Evaluación de expresiones aritméticas, entre otras.
 Operaciones: Se dividen en dos grupos.
             Principales: operaciones como poner, quitar.
             Auxiliares: operaciones como cima,vacía,llena.

En la figura numero 7 se muestra gráficamente una pila con las dos operaciones básicas que son apilar y desapilar.

Clases Nodo

Clases Nodo.


Clase NodoVentajaDesventaja
Objetose puede guardar el objeto sin problema.Si se requiere guardar objeto e otro tipo del que se ha declarado no es posible.
ObjectSe puede guardar objetos de cualquier tipo.Solo reconoce metodos de su clase, y no se pueden setiar y mostrar un dato de algun objeto porque no reconoce metodos set y get,
GenericaReconoce todo tipo de objeto.No tiene desventaja ya que es la mas funcional de las ya mencionadas anterormente.

La clase genérica esta constituida de la siguiente manera:

public class Nodo<T> {
private T dato;
private Nodo sig;
// metodos get, set y constructor. 
}

Apreciaciones importantes y reflexión: 

Para declarar una clase Nodo genérica se realiza de la siguiente forma:
Nodo<Estudiante> r;
Si no se indica porque objeto es reemplazada se convierte a tipo Object, y mas adelante puede haber un error ya que Object no contiene métodos. 

se aprendió en esta clase la diferencia entre las diferentes clases de nodo y cual es la que  resulta mas funcional que es la tipo genérica que puede guardar cualquier tipo de dato.

Ordenar Listas enlazadas.

Ordenar Listas enlazadas.

Figura numero 6

Para ordenar una lista enlazada se debe tener en cuenta tres variables aparte de la que apunta al primer nodo de la lista,  variables de tipo nodo una llamada actual que inicialmente apunta al primer nodo de la lista, otra anterior que estará apuntando al nodo  anterior al cual apunta actual, y otro nodo llamado fin que estará apuntando al ultimo nodo de la lista. Para realizar el ordenamiento como aparece en la Figura  numero 5 se bebe realizar mediante el siguiente algoritmo de ordenamiento.

If(p!=null){                                                                                                                                                  Nodo r =p;                                                                                                                                             Nodo s = null; 
while(r!null && r.getDato()<x){ 
s=r; r = r.getSig(); }                                                                                                                            if(r!=null){
if(r==p){ 
 p= new Nodo(x,p); } else {                                                                                                               s.setSig(new Nodo(x,r)); }  
} else {                                                                                                                                                    q.setSig(new Nodo(x,null));                                                                                                              q=q.getSig();  }   
}else {                                                                                                                                                 p=q=new Nodo (x,null); }

Explicando un poco el algoritmo primero se debe asegurar que la lista no este vacía. Luego se le asigna a cada variable su función en el algoritmo la variable actual es r, la variable anterior es s, y la variable fin es q. se realiza un while buscando que dato que esta almacenados en los nodos es menor del que se quiere insertar.  luego se va preguntando en que parte quedo actual osea la variable r para si realizar el ordenamiento.
En la figura numero 5 se muestra primero una variable de referencia p apuntando al primer nodo de la lista, y se encuentran los datos no ordenados, en la segunda lista es misma de la primero siendo que esta ya se encuentra ordenada.
Logre aprender en esta clase la forma mas adecuada y fácil de ordenar una lista enlazada, y lo importante que son ahora en adelante las otras variables declaradas. 


Eliminar Nodos en listas enlazadas.



Eliminar Nodos en listas enlazadas.


Figura numero 5

En la clase vista aprendimos mas operaciones que se pueden realizar en una lista enlazada simple y dobles, el primero en realizar fue eliminar un nodo en listas enlazadas simples, y para esto la condición que existe es que la lista debe tener elementos para poder eliminar. Se realiza mediante las siguientes instrucciones:

if(p!=null){ 
if(p==q){ 
p=q=null; 
} else { 
p=p.getSig(); } 
} else {
System.out.println(“Lista Vacia”); }

se valida que la lista este vacía, luego se valida que exista un solo nodo. En caso de que las dos condiciones se cumplan quiere decir que solo existe un nodo y se eliminara dando valor a p y q con null, en caso de que la segunda condición no se cumpla quiere decir que existe mas de un solo nodo y como se quiere eliminar el primero se le dice a p que ahora apunte al siguiente nodo.

Eliminar Lista Enlazadas Dobles: para eliminar un nodo en las listas enlazadas dobles se requiere realizar el siguiente algoritmo.

if(p!=null){ 
if(p==q){ 
p=q=null; 
} else { 
p=p.getSig(); 
p.setAnt(null); 

} else { 
System.out.println(“Lista Vacia”); 
}

este algoritmo es parecido al anterior siendo que este ay que darle valor a  la parte anterior del nodo que va a quedar de primero.

Eliminar, al final de, en listas enlazadas simple: Para la eliminación de un nodo en una lista enlazada simple es necesario de declarar otra variable y esta apuntara al antepenúltimo nodo de la lista.

if(p!=null){ 
if(p==q){ 
p=q=null; 
} else { 
Nodo r =p; 
while(r.getSig()!=q){ 
r= r.getSig(); 

r.setSig(null); 
q=r; } 
} else { 
System.out.println(“Lista Vacia”); 
}


principalmente se realizan dos validaciones la primera es que la lista tenga datos almacenados, la segunda es preguntar si solo se encuentra un solo nodo, en caso de que las dos se cumplan entonces se les da valor a p y q de null, e caso de que la segunda condición no se cumpla se declara otra variable de tipo Nodo y que sea igual a p, mediante una estructura repetitiva se pasara  la nueva variable que declaramos hacia el antepenúltimo nodo que tiene la lista, cuando ya se tiene al nodo que esta anterior del ultimo en la parte siguiente de este se le asignara un null y ahora la variable q que es la apunta al ultimo nodo pasara donde esta la variable que declaramos en este caso r.

Eliminar Lista enlazada Doble:  en esta instrucciones no es necesario declarar la variable que apunte al antepenúltimo nodo.

if(p!=null){ 
if(p==q){ 
p=q=null; 
} else { 
q=q.getAnt(); 
q.setSig(null); } 
} else { 
System.out.println(“ListaVacia”); 
}


Estas instrucciones son parecidas al eliminar anterior siendo que este no se declara la variable r que apunta al antepenúltimo nodo, cuando la segunda condición es falsa se le asigna un nuevo valor a q el cual es la dirección que el almacena en su parte anterior, y a la parte siguiente del nodo que apunta q ahora se le asigna un null ya que es el ultimo nodo de la lista.

Método Buscar para listas enlazadas simples.




if(p!=null){
Nodo r=p;
Nodo s=null;
while(r!=null && r.getDato()!=x){
s=r;
r=r.getSig();
} if(r!=null){
// código para *Consultar*Modificar, *Eliminar
} else {
System.out.println(“Dato noencontrado”);
} else {
System.out.println(“Lista Vacia”);
}


En el siguiente algoritmo validamos que la lista tenga datos, mediante un ciclo while buscaremos el dato que se quiere encontrar. se valida en caso de que no encuentre el dato.

En la figura numero 5 se muestra una operación de listas enlazadas simples la cual es eliminación al inicio.

Apreciaciones importantes y Reflexión:  

Es muy importante antes de realizar cualquier método en una lista enlazada ya sea simple o dobles analizar lo que se quiere hacer mediante dibujos que ayuden a  dar una solución.