Free Web Site - Free Web Space and Site Hosting - Web Hosting - Internet Store and Ecommerce Solution Provider - High Speed Internet
Search the Web

Pilas


Una pila es una estructura de datos en la cual el acceso está limitado al elemento más recientemente insertado y solamente puede crecer y decrecer por uno de sus extremos.

Las pilas se denominan también estructuras LIFO (Last-In-First-Out), porque su característica principal es que el último elemento en llegar es el primero en salir.

En todo momento, el único elemento visible de la estructura es el último que se colocó.
Se define el tope de la pila como el punto donde se encuentra dicho elemento.

En una pila, las tres operaciones naturales de insertar, eliminar y obtener el dato, se renombran por push, pop e info.

Interfaz

Como existen diferentes formas de implementar una Pila ( vectores, listas enlazadas ) la primera parte del diseño está constituida por la declaración de una interfaz, con las operaciones básicas.

interface Pila
{
    void push(Object x);
    void pop( ) throws Exception;
    Object info( ) throws Exception;
    boolean esVacia( );
    void vaciar( );    
}

Métodos

     push( x )    --> Inserta x
     pop( )        --> Elimina el último elemento insertado
     info( )        --> Retorna el último elemento insertado
     esVacia( )   --> Retorna true si no existen elementos ; false en caso contrario
     vaciar( )     --> Elimina todos los elementos


Implementación con Lista Enlazada

class Nodo
{
    public Object dato;
    public Nodo siguiente;
    
    public Nodo(Object elemento, Nodo sgte)
    {
        this.dato = elemento;
        this.siguiente = sgte; 
    }    
    
    public Nodo(Object elemento)
    {
        this(elemento,null);    
    }
}


class PilaLi implements Pila
{
    private Nodo tope;
    
    public PilaLi( )
    {
        tope = null;    
    }    
    
    public boolean esVacia( )
    {
        return tope == null;
    }
    
    public void vaciar( )
    {
        tope = null;    
    }
    
    public void push(Object x)
    {
        tope = new Nodo(x,tope);    
    }
    
    public Object info( ) throws Exception
    {
        if ( esVacia( ) )    
            throw new Exception("info");
        
        return tope.dato;
    }
    
    
    public void pop( ) throws Exception
    {
        if ( esVacia( ) )
            throw new Exception("pop");
        
        tope = tope.siguiente;
    }
    
} 

Programa de prueba

class TestPila
{
    public static void main(String arg[ ])
    {
        Pila p = new PilaLi( );
        
        for(int i = 0; i < 10; i++)
            p.push( new Integer(i+1) );
            
        System.out.print("\n\tContenido : ");
        
        try
        {
            for( ; ; )
            {
                System.out.print(" " + p.info( ) );
                p.pop( );
            }
        }
        catch(Exception e){ }    
    
        System.out.println( );
    }    
}

Ejercicio resuelto

Implementar un método que imprima un número en cualquier base, usando un método que use pilas.

Solución

import java.io.*;

class test2
{
    public static void convertirBase(int numero , int base) 
    {
        Pila p = new PilaLi( );
    
        while(numero != 0)
        {
            p.push(new Integer( numero % base ) );
            numero /= base;
        }    
    
        try
        {
            for(;;)
            {
                System.out.print(p.info( ) );
                p.pop( );
            }
        
        } catch(Exception e) { }
    }    
    
    
    public static void main(String arg[ ])
    {
        BufferedReader in = new BufferedReader(new
            InputStreamReader(System.in));
        
        int num,base;
        boolean seguir = true;
        
        while(seguir)
        {
            try
            {
                System.out.print("\n\tIngrese un numero : ");
                num = Integer.parseInt(in.readLine( ) );
            
                System.out.print("\tIngrese la nueva base : ");
                base = Integer.parseInt(in.readLine( ) );
        
                System.out.print("\tEl numero " + num + " en base " + base + " es : ");
                convertirBase(num,base);    
            
                System.out.print("\n\tQuiere seguir : s/n : ");
                String resp = in.readLine( );
                
                if (resp.charAt(0) == 's') seguir = true;
                else seguir = false;
            }
            catch (Exception e)
            {
                System.out.println("\tError de entrada : " + e);    
            }
        
        } 
        
    } 

}

salida del programa

bajar archivos