miércoles, 18 de noviembre de 2015

Ejercicios


Ejercicios
Un polinomio se puede representar como una lista enlazada. El primer nodo de la lista representa el primer termino del polinomio, el segundo nodo al segundo término del polinomio y así sucesivamente. Cada nodo tiene como campo el dato el coeficiente del término y el exponente.


Clase Main
import java.util.Scanner;

public class Ejercicio7 {
    public static int ingresarEntero(String mensaje, int min, int max) {
        Scanner ingreso = new Scanner(System.in);
        int dato;
        do {
            System.out.println(mensaje +" entre "+min +" y "+max);
            dato = ingreso.nextInt();
        } while (dato < min || dato > max);
        return dato;
    } 
     public static String ingresarString(String mensaje){
        Scanner ingreso=new Scanner(System.in);
        String texto=""; 
        System.out.println(mensaje);
        texto= ingreso.nextLine();
        return texto;
    }   
    public static void main(String[] args) {
        int resp=0, num=0 ,grado=0,op=0;
        Lista coleccion=new Lista();
        Scanner Entrada= new Scanner(System.in);
        do{
            System.out.println("1-->Ingresar terminos \n2-->Reemplazar terminos(varios valores)\n3-->reemplazar con un valor determinado\nSeleccione una: ");
            op=Entrada.nextInt();
            switch(op){
                
                case 1:{
                    do{
                       coleccion.agregarNodoAlFinal(new Numero(ingresarString("Ingrese el signo del termino \n Positivo --> +\n Negativo --> -"),
                               ingresarEntero("Ingrese el termino: ",1,100),
                               ingresarEntero("Ingrese el grado deltermino ",0,100)));
                       System.out.println("¿Desea ingresar un termino adicional?");
                       resp=Entrada.nextInt();
                    }while(resp!=0);
                    coleccion.recorreLista();
                    }
                    break;
                case 2:
                    coleccion.reemplazo(0.5);
                    coleccion.reemplazo(1.0);
                    coleccion.reemplazo(1.5);
                    coleccion.reemplazo(2.0);
                    coleccion.reemplazo(2.5);
                    coleccion.reemplazo(3.0);
                    coleccion.reemplazo(3.5);                 
                    coleccion.reemplazo(4.0);
                    coleccion.reemplazo(4.5);
                    coleccion.reemplazo(5.0);
                    break;
                case 3:
                    coleccion.reemplazo(ingresarEntero("Ingrese un numero ",-100,100));
                    break;
            }
        System.out.println("\n¿Desea ingresar otro termino? 1--->Si 0--->No");
        resp=Entrada.nextInt();
        }while(resp!=0);
        System.out.println("\nEl polinomio es: ");
        coleccion.recorreLista();
    }
    
} 



Clase Lista


 import static java.lang.Math.pow;

public class Lista {
    Nodo inicio;
    Nodo fin;
     public void agregarNodoAlFinal(Numero obj){
       Nodo nuevo=new Nodo(obj);
        Nodo reco1;
        Nodo reco2;
        if(inicio==null){
            inicio=nuevo;
            nuevo.setSiguiente(null);
        }else{
            reco1=inicio;
            while(reco1!=null){
                reco2=reco1.getSiguiente();
                if(nuevo.getNum().getGrado()>=reco1.getNum().getGrado()){
                    nuevo.setSiguiente(inicio);
                    inicio=nuevo;
                    break;
                }else{
                    if(nuevo.getNum().getGrado()nuevo.getNum().getGrado()&&reco2.getNum().getGrado()<=nuevo.getNum().getGrado()){
                            reco1.setSiguiente(nuevo);
                            nuevo.setSiguiente(reco2);
                            break;
                        }else{
                            reco1=reco1.getSiguiente();
                        }
                    }
                }
            }
        }
    }
    public void recorreLista(){
        Nodo aux=inicio;
        while(aux!=null){
            if(aux.getNum().getGrado()>=1){
                System.out.printf(aux.getNum().getSigno()+aux.getNum().getNum()+"x^"+aux.getNum().getGrado());
                aux=aux.getSiguiente();
            }else{
                System.out.printf(aux.getNum().getSigno()+aux.getNum().getNum());
                aux=aux.getSiguiente();
            }
        }
        System.out.println("\n");
    }
    public void reemplazo(double n){
        Nodo aux=inicio;
        int r=0;
        double exp=0, re=0, base=0, acu=0;
        while(aux!=null){
            base=(double)aux.getNum().getNum();
            exp=(double)aux.getNum().getGrado();
            re= pow(n,exp);
            if(aux.getNum().getSigno().compareTo("+")==0){
                acu=acu+(base*re);
            }
            if(aux.getNum().getSigno().compareTo("-")==0){
                acu=acu-(base*re);
            }
            aux=aux.getSiguiente();
        }
        System.out.printf("\nEl resultado del reemplazo de: "+"f("+n+")=");
        recorreLista();
        System.out.printf("f("+n+")= "+acu);
    }
} 



Clase Nodo


public class Nodo {
    Numero num;
    Nodo Siguiente;

    public Nodo(Numero num) {
        this.num = num;
    }
    public Numero getNum() {
        return num;
    }
    public void setNum(Numero num) {
        this.num = num;
    }
    public Nodo getSiguiente() {
        return Siguiente;
    }
    public void setSiguiente(Nodo Siguiente) {
        this.Siguiente = Siguiente;
    } 
} 

 
Clase Número


public class Numero {
    String signo;
    int num;
    int grado;
    public Numero(String signo, int num, int grado) {
        this.signo = signo;
        this.num = num;
        this.grado = grado;
    }
    public String getSigno() {
        return signo;
    }
    public void setSigno(String signo) {
        this.signo = signo;
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public int getGrado() {
        return grado;
    }
    public void setGrado(int grado) {
        this.grado = grado;
    }
}




Como corre el Programa


Crear una Clase Punto, luego crear un TAD-lista simple, implementar un método para calcular la distancia entre el Punto de origen y el cada punto de la lista. Final mente determinar el punto mas alejado del origen.

 Clase Main

public class Principal {

    public static void main(String[] args) {
        Lista coleccion=new Lista();
        coleccion.insertarInicio(new Punto(5,8.6));
        coleccion.insertarInicio(new Punto(-8,10));
        coleccion.insertarInicio(new Punto(15,108.6));
        coleccion.insertarFinal(new Punto(-50,-45));
        coleccion.insertarInicio(new Punto(-17,81));
        System.out.println("El nodo mas distante al origen es "+coleccion.Distancia().getDato().toString());
    } 


 
Clase Lista


public class Lista {
    Nodo inicio;
    Nodo fin;

    public Lista() {
        inicio=null;
        fin=null;
    }
     public void insertarInicio(Punto dato){
        Nodo nuevo=new Nodo(dato, inicio);
        inicio=nuevo;
        if(fin==null)
            fin=inicio;
    }
      public void insertarFinal(Punto dato){
        Nodo nuevo=new Nodo(dato,null);
        if(inicio==null){
            inicio=nuevo;
        }else{
            fin.setSiguiente(nuevo);
            fin=nuevo;
        }
    }
      public Nodo Distancia(){
          Punto origen=new Punto(0,0);
          Nodo aux=inicio;
          Nodo mayorDistancia=inicio;
          double mayor=0;
          double distancia=0;
          while(aux!=null){
              distancia=calculoDistancia(origen, aux.getDato());
              if(distancia>mayor){
                  mayor=distancia;
                  mayorDistancia=aux;
              }
              aux=aux.getSiguiente();
          }
          return mayorDistancia;
          
      }
      public double calculoDistancia(Punto a, Punto b){
         double distancia=( Math.pow(b.getY()-a.getY(), 2.0)+Math.pow(b.getX()-a.getX(), 2.0));
         return distancia;
      }
      
} 



Clase Nodo


public class Nodo {
    private Punto dato;
    private Nodo siguiente;

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

    public Punto getDato() {
        return dato;
    }

    public void setDato(Punto dato) {
        this.dato = dato;
    }

    public Nodo getSiguiente() {
        return siguiente;
    }

    public void setSiguiente(Nodo siguiente) {
        this.siguiente = siguiente;
    }
    
} 




Clase Punto


public class Punto {
    private double x;
    private double y;

    public Punto() {
    }

    public Punto(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double getX() {
        return x;
    }

    public void setX(double x) {
        this.x = x;
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        this.y = y;
    }

    @Override
    public String toString() {
        return "Punto (" + "x= " + x + ", y= " + y+")" ;
    }
    
}



Como Corre el Programa


Crear una lista simple la cual debe ingresar números reañes, luego ordenarlos de mayor a mayor, imprimir la lista, obtener el promedio de los valores de cada lista, comprobar cuál es el valor que más se repite en la lista.


Clase Main

import java.util.Scanner;

public class Principal {
   
    public static void main (String args[]){
        Lista insertar=new Lista();
        Scanner sc= new Scanner (System.in);
        int res,num;
        System.out.println("¿Cuantos numeros desea ingresar?");
        res=sc.nextInt();
        for(int i=0;i
 


Clase Lista


public class Lista {  
    private Nodo raiz;
    public Lista(){
        raiz=null;
    }
    public void insertarDato (int dato){
        Nodo nuevo=new Nodo(dato);
        Nodo reco1;
        Nodo reco2;       
        if(raiz==null){
            raiz=nuevo;
            nuevo.siguiente=null;
        }else{
            reco1=raiz;
            while(reco1!=null){
                reco2=reco1.siguiente;
                if(nuevo.dato>=reco1.dato){
                    nuevo.siguiente=raiz;
                    raiz=nuevo;
                    break;
                }else{
                    if(nuevo.datonuevo.dato&&reco2.dato<=nuevo.dato){
                            reco1.siguiente=nuevo;
                            nuevo.siguiente=reco2;
                            break;
                        }else{
                            reco1=reco1.siguiente;
                        }
                    }
                }
            }
        }
    }
   
    public void listarNodos(){
        Nodo temporal=raiz;
        while(temporal!=null){
            System.out.println("" +temporal.dato);
            temporal=temporal.siguiente;
        }
    }
    public void promedioNodos(){
        Nodo temporal=raiz;
        int cont=0;
        double prom=0;
        while(temporal!=null){
            cont++;
            prom=prom+temporal.dato;
            temporal=temporal.siguiente;
            
        }
        System.out.println("El promedio es: " +prom/cont);
    }
    public void repite(){
        int cont=0;
        int a[]=new int[100];
        int frecuenciaTemp, frecuenciaModa = 0, moda =0;
        Nodo temporal=raiz;
        while(temporal!=null){
            cont++;         
            a[cont]=temporal.dato;
            temporal=temporal.siguiente;
        }
        for(int i=0;i<=cont;i++){
            frecuenciaTemp=0;
            for(int j=0;j= frecuenciaModa){
                frecuenciaModa = frecuenciaTemp;
                moda = a[i];
            }
                
            }
        }
        System.out.println("El que mas se repite es " + moda);
    }
}



Clase Nodo


public class Nodo {
    int dato;
    Nodo siguiente;

    Nodo(int dato) {
        this.dato=dato;
    }

    public int getDato() {
        return dato;
    }

    public void setDato(int dato) {
        this.dato = dato;
    }

    public Nodo getSiguiente() {
        return siguiente;
    }

    public void setSiguiente(Nodo siguiente) {
        this.siguiente = siguiente;
    }

    public Nodo(int dato, Nodo siguiente) {
        this.dato = dato;
        this.siguiente = siguiente;
    }
}



Como corre el programa


 

Pilas y Colas


Estructura de Datos

Pilas

La pila es una lista ordenada en la que el modo de acceso es en base a la estrcutura "LIFO" que proviene del ingles Last In First Out que se traduce como el ultimo en entrar, primero en salir. La pila permite almacenar y recuperar los datos. La parte superior es la que se encuentra disponible en todo momento. Y la operación retirar permite obtener el objeto.






Operaciones básicas de la pila

1. Apilar: Esta operación permite colocar un objeto en la pila.
2. Des apilar: También conocido como retirar, que elimina el último elemento que se encuentra apilado. Y permite el acceso al siguiente.


Aplicaciones de las Pilas

Se las puede utilizar, al evaluar las expresiones en notación posfija, en reconocedores sintácticos de lenguajes independientes del contexto y facilita la implementación en la recursividad.


En otras palabras la pila es un contenedor de nodos y tiene las operaciones de apilar y des apilar, la pila solo permite ver la parte superior y para ver lo que esta después de lo visible se debe des apilar.

Operaciones

Aparte de las de apilar y retirar, se implementan las siguientes operaciones:

Crear: Permite crear una lista basía por medio de un constructor.
Tamaño: Permite regresar el número de elementos de una pila.
Apilar: Añade un elemento a la pila.
Desapilar: Devuelve el elemento que se encuentra en la cima de la pila.
Cima: Devuelve el elemento que se encuentra en la cima de la pila.
vacía: Devuelve un true si no existen elementos en la pila o un false en el caso de que existan elementos en la misma.

Para implementar una pila se utiliza un array list o listas enlazadas simples.





Colas

Una cola se caracteriza por ser una secuencia de elementos en la que se inserta por un extremo y el proceso de extracción por el otro. Este utiliza la estructura FIFO cuyas siglas en ingles es Fist In Fist Out que significa el primero en entrar es el primero en salir. En los sismas 




Operaciones

Crear: Permite crear una lista vacía.
Encolar: Añade un elemento al final de una cola.
Desencolar: Permite eliminar un elemento del principio de la cola.
Frente: Devuelve el primer elemento de la cola, el primero que ingreso.




Tipos de colas

Colas circulares: Son las que estan unidos y el último y el primer elemento.

Colas de prioridad: Se prioriza el orden de los elementos de la cola, Si existen dos elementos con la misma prioridad se implementan de dos formas:

1. Añadir un campo a cada nodo con su prioridad.

2. Crear colas como prioridades existentes y almacenar cada elemento en su cola. 

Bicolas: Son aquellas cuyos nodos se puede retirar tanto por el inicio como por el fin, es decir el inicio y el fin apuntan a cada uno de los extremos.

1. Entrada restringuidas: En estas se inserta por el final de la cola y se puede eliminar al inicio o al final.

2. Salida Restringida: En estas solo se puede eliminar por el final, y se puede insertar por el inicio y por el final.

 

VIDEO DE PILAS Y COLAS