lunes, 23 de mayo de 2016

Pilas Programación estructurada:

Definición:
Una pila en Programación es una lista ordenada de datos que se caracteriza por seguir la siguiente estructura: LIFO (Last in, first out), que significa que el último dato en entrar será el primero en salir.

La pila además se caracteriza por tener los métodos push (para añadir datos) y pop (para sacar un dato).



Mapa conceptual:


Código Pila:
public class Pila {
    private Nodo cima;
    public Pila(){
        cima=null;
    }

    public Nodo getCima() {
        return cima;
    }
    
    //agregar a inicio
    public void push(Estudiante datos){
        Nodo nuevo=new Nodo(datos,null,cima);
        if(cima!=null){
            cima.setAnterior(nuevo);
        }
        cima=nuevo;
        
    }
    public Estudiante pop(){
        if(cima==null){
            System.out.println("NO HAY DATOS");
            return null;
        }
        else if(cima.getSiguiente()==null){
            Nodo aux = cima;
            cima=null;
            return aux.getDatos();
        }
        else{
            Nodo aux = cima;
            
            cima=cima.getSiguiente();
            aux.setSiguiente(null);
            cima.setAnterior(null);
            return aux.getDatos();
        }
    }
    public void imprimirRecursiva(Nodo aux){
        
        if(aux!=null){
            System.out.println("Nombre: " +aux.getDatos().getNombre());
            System.out.println("Cantidad de Materias: "+aux.getDatos().getNumeroMaterias());
            System.out.println("Precio a pagar por materias: "+aux.getDatos().precioPorMaterias());
            System.out.println("Precio por Matricula extraordinaria: "+aux.getDatos().ValorPorExtraordinario());
            double total=aux.getDatos().ValorPorExtraordinario()+aux.getDatos().precioPorMaterias();
            System.out.println("Total a pagar: "+total);
            imprimirRecursiva(aux.getSiguiente());
        }
        
        
    }
    
    
}

Tratamiento de expresiones:



Tratamiento de expresiones infija:
Notación utilizada comúnmente en la cual los operadores se encuentran entre los operandos; Ejemplo: A+B 
Tratamiento de expresiones posfija:
Notación en la cual los operadores se encuentran después de los operandos; Ejemplo: AB+
Tratamiento de expresiones prefija:
Notación en la cual los operadores se encuentran antes de los operandos; Ejemplo: +AB

Colas Programación Estructurada:

Definición:
Una cola en Programación es una lista ordenada de datos que se caracteriza por seguir la siguiente estructura: FIFO (First in, first out), que significa que el primer dato en entrar será el primero en salir.

La pila además se caracteriza por tener los métodos push (para añadir datos) y pop (para sacar un dato).



Mapa conceptual:



Código Colas: 
public class Cola {
    
    private Nodo inicio;
    private Nodo fin;

    public Cola() {
        inicio=fin=null;
    }

    public Nodo getInicio() {
        return inicio;
    }

    public void setInicio(Nodo inicio) {
        this.inicio = inicio;
    }

    public Nodo getFin() {
        return fin;
    }

    public void setFin(Nodo fin) {
        this.fin = fin;
    }
    
    //agregar a inicio

    public void ingresar(Estudiante datos) {
        Nodo nuevo = new Nodo(datos);
        if (inicio == fin && inicio == null) {
            inicio = fin = nuevo;
        } else {
            nuevo.setSiguiente(inicio);
            inicio = nuevo;
        }

    }
    
    public Estudiante eliminar() {
        if (inicio == null) {
            System.out.println("NO HAY DATOS");
            return null;
        }
        Nodo aux = inicio;
        Nodo aux2 = fin;
        if (inicio == fin) {

            inicio = fin = null;

        }
        while (aux.getSiguiente() != fin) {

            aux = aux.getSiguiente();
        }
        aux.setSiguiente(null);
        return aux2.getDatos();
    }  
public void imprimir() {
        Nodo aux=inicio;
        while (aux != null) {
            System.out.println("Nombre: " + aux.getDatos().getNombre());
            System.out.println("Cantidad de Materias: " + aux.getDatos().getNumeroMaterias());
            aux=aux.getSiguiente();
        }

    }

}


Colas con prioridad:

Definición:
Una cola con prioridad es una estructura de datos con las características de una cola, pero con la diferencia que sus datos tienen una prioridad asignada, en este tipo de estructura, los datos con mayor prioridad serán desencolados primero.


Mapa conceptual:



Código Colas con Prioridad:
public class Cola {
    
    private Nodo inicio;
    private Nodo fin;

    public Cola() {
        inicio=fin=null;
    }

    public Nodo getInicio() {
        return inicio;
    }

    public void setInicio(Nodo inicio) {
        this.inicio = inicio;
    }

    public Nodo getFin() {
        return fin;
    }

    public void setFin(Nodo fin) {
        this.fin = fin;
    }
    
    //ingreso ordenado

    public void ingresoOrdenado(Estudiante datos) {

        Nodo nuevo = new Nodo(datos);

        if (inicio == fin && inicio == null) {
            inicio = fin = nuevo;

        } else if (inicio == fin) {
            if (inicio.getDatos().getEdad()> datos.getEdad()) {

                nuevo.setSiguiente(inicio);
            inicio.setAnterior(nuevo);
            inicio = nuevo;

            } else {
                inicio.setSiguiente(nuevo);
                fin = nuevo;
                fin.setAnterior(inicio);

            }
        } else if (datos.getEdad() <= inicio.getDatos().getEdad()) {
            nuevo.setSiguiente(inicio);
            inicio.setAnterior(nuevo);
            inicio = nuevo;
            
            
        } else if (datos.getEdad() >= fin.getDatos().getEdad()) {
            fin.setSiguiente(nuevo);
            nuevo.setAnterior(fin);
            
            fin = nuevo;
            
        } else {
            Nodo aux = inicio;
            Nodo tempo;

            while (aux != null) {

                if (aux.getDatos().getEdad() <= datos.getEdad() && aux.getSiguiente().getDatos().getEdad() >= datos.getEdad()) {
                    tempo = aux.getSiguiente();
                    aux.getSiguiente().setAnterior(nuevo);
                    aux.setSiguiente(nuevo);

                    nuevo.setAnterior(aux);
                    nuevo.setSiguiente(tempo);

                    aux = null;
                } else {
                    aux = aux.getSiguiente();

                }
            }

        }
    }
    

    public Estudiante eliminar() {
        if (inicio == null) {
            System.out.println("NO HAY DATOS");
            return null;
        }
        Nodo aux = inicio;
        Nodo aux2 = fin;
        if (inicio == fin) {

            inicio = fin = null;

        }
        while (aux.getSiguiente() != fin) {

            aux = aux.getSiguiente();
        }
        aux.setSiguiente(null);
        return aux2.getDatos();
    }
    public void imprimir() {
        Nodo aux=inicio;
        while (aux != null) {
            System.out.println("Edad: " + aux.getDatos().getEdad());
            
            aux=aux.getSiguiente();
        }

    }

}

Referencias: 
Joyanes, L. Zahonero, I. (2008). Estructura de Datos en Java (1era. Ed.). Madrid, España: McGrawHill. 
Allen, M. (2013). Estructura de Datos en Java (4ta. Ed.). Madrid, España: Pearson. 
Autores:
Xavier Noboa
Alejandro Sánchez