martes, 21 de febrero de 2012

Construya su propia computadora (implementacion de Simpletron).





Abajo Link para descargar código fuente.



Este es el titulo de un ejercicio que ví propuesto en el libro "Como programar en Java, 5ta edicion pagina 294" y que nos lleva a la implementacion de un sistema llamado Simpletron para la ejecucion de ordenes estilo ensamblador, la implemetacion es bastante basica, pero me gusta mucho y quiero aqui compartir con ustedes.

Aqui esta el link para que lean las especificaciones que aparecen en ellibro.

Les resumo que, el programa esta dotado de una memoria que almacena maximo 100 numeros enteros (en el libro llamados palabras), ademas de una variable llamada acumulador de tipo entero; en la memoria almacenamos ordenenes compuestas por un numero de 4 digitos (palabras) donde los dos primeros representan un codigo de operacion y los dos numeros restantes operando, ejemplo 1011 asi:

|10|11|

 |  |
 |  +--- operando
 +--- Codigo de operacion

Claro que el ejercicio propuesto no termina alli, pues en los ejercicios 20.26 y 20.27 del mismo libro proponen crear con este un compilador para un lenguaje de alto nivel; en la medida de lo posible estare gastandole algo de tiempo al ejercicio.

Al final expongo la implementacion que hice para ustedes, aunque no lo hice a cabalidad como el libro lo pide, empezando en que no use aplet para escribir un codigo mas simple.


Hosting
 

Los codigo de operacion son los siguiente (Sugeridos en el libro)

Operaciones de entrada/salida:
10:Lee una palabra desde el teclado y la introduce en una ubicación específica dememoria.
11:Escribe una palabra de una ubicación específica de memoria y la imprime en lapantalla.


Operaciones de carga/almacenamiento:
20:Carga una palabra de una ubicación específica de memoria y la coloca en elacumulador.
21:Almacena una palabra del acumulador dentro de una ubicación específica dememoria.


Operaciones aritméticas:
30:Suma una palabra de una ubicación específica de memoria a la palabra en elacumulador (deja el resultado en el acumulador).:
31:Resta una palabra de una ubicación específica de memoria a la palabra en elacumulador (deja el resultado en el acumulador).:
32:Divide una palabra de una ubicación específica de memoria entre la palabra enel acumulador (deja el resultado en el acumulador).
33:Multiplica una palabra de una ubicación específica de memoria por la palabra enel acumulador (deja el resultado en el acumulador).


Operaciones de transferencia de control:
40:Bifurca hacia una ubicación específica de memoria.
41:Bifurca hacia una ubicación específica de memoria si el acumulador es negativo.
42:Bifurca hacia una ubicación específica de memoria si el acumulador es cero.
43:Alto. El programa completó su tarea.





Pasos para pedir dos numero enteros, sumarlos y mostrar el resultado;
1010 (Pedir un numero y guardarlo en memoria en la posicion 10)
1011
(Pedir un numero y guardarlo en memoria en la posicion 11)
2010 (Cargar lo que este en la posicion 10 de la memoria al acumulador)
3011 (Sumar lo que este en la posicion 11 y el acumulador, el resultado se guardara en el acumulador)
2112 (Almacenar lo que este en el acumulador a la memoria en la posicion 12)
1112; (Imprimir lo que este en la memoria en la posicion 12)

Nota: ver que la ultima instrucion termina en punto y coma ';'

Pantallazo de la aplicación:



--------------------------------------------------------------------------------------------------
Hallar el mayor de tres numeros;
1020
1021
1022
2020
3121
4109
2020
2123
4011
2021
2123
3122
4115
1123
4300
1122;

Nota: ver que la ultima instrucion termina en punto y coma ';'

Codigo fuente clic aqui.


Hosting

Comenta acerca del código.

domingo, 5 de febrero de 2012

Teoria de grafos. Imprementacion de un grafo, recorrido en profundidad y anchura.





(Al final de la pagina codigo para descargar).

También te puede interesar "Implementacion en Java del Algoritmo de Dijkstra", "Aplicacion de mapas, usando grafos y Dijkstra"

Definicion de grafos: Un grafo es un conjunto, no vacío, de objetos llamados vértices (o nodos) y una selección de pares de vértices, llamados aristas (edges en inglés) que pueden ser orientados o no. Típicamente, un grafo se representa mediante una serie de puntos (los vértices) conectados por líneas (las aristas). (Por Wikipedia).

-----------------------------------------------------------------------------
Existen muchas forma de representar grafos, la mas comun es usar circulos para los nodos y lineas para las aristas.
La que use para modelar y luego implemetar el grafo consiste en un arreglo de nodos, los cuales pueden apuntar a otros nodos dentro del mismo arreglo asi:


Podemos interpretarlo de la siguiente forma:
[A] tiene como adyancentes a [B],
[C],[F]
[B] tiene como adyancentes a [A],[F]
[C] tiene como adyancentes a [A],[D]
[D] tiene como adyancentes a [C]
[F] tiene como adyancentes a [A],[B]
-----------------------------------------------------------------------------

Recorrido o búsqueda en profundidad (en inglés DFS o Depth First Search): es un algoritmo que permite recorrer todos los nodos de un grafo o árbol (teoría de grafos) de manera ordenada, pero no uniforme. Su funcionamiento consiste en ir expandiendo todos y cada uno de los nodos que va localizando, de forma recurrente, en un camino concreto. Cuando ya no quedan más nodos que visitar en dicho camino, regresa (Backtracking), de modo que repite el mismo proceso con cada uno de los hermanos del nodo ya procesado.
(Por Wikipedia).

Búsqueda en anchura (en inglés BFS - Breadth First Search): es un algoritmo para recorrer o buscar elementos en un grafo (usado frecuentemente sobre árboles). Intuitivamente, se comienza en la raíz (eligiendo algún nodo como elemento raíz en el caso de un grafo) y se exploran todos los vecinos de este nodo. A continuación para cada uno de los vecinos se exploran sus respectivos vecinos adyacentes, y así hasta que se recorra todo el árbol.
(Por Wikipedia).

------------------------------------------------------------------------------------------
Algorito de profundiad por Wikipedia

DFS_Visitar(nodo u)
 estado[u] ← VISITADO
 tiempo ← tiempo + 1
 d[u] ← tiempo
 PARA CADA v ∈ Vecinos[u] HACER
 SI estado[v] = NO_VISITADO ENTONCES
 padre[v] ← u
 DFS_Visitar(v)
 estado[u] ← TERMINADO
 tiempo ← tiempo + 1
 f[u] ← tiempo
Algorito de anchura por Wikipedia

 BFS(grafo G, nodo_fuente s)
{
// recorremos todos los vértices del grafo inicializándolos a NO_VISITADO,
// distancia INFINITA y padre de cada nodo NULL
for u ∈ V[G] do
{
estado[u] = NO_VISITADO;
distancia[u] = INFINITO; /* distancia infinita si el nodo no es alcanzable */
padre[u] = NULL;
}
estado[s] = VISITADO;
distancia[s] = 0;
Encolar(Q, s);
while !vacia(Q) do
{
// extraemos el nodo u de la cola Q y exploramos todos sus nodos adyacentes
u = extraer(Q);
for v ∈ adyacencia[u] do
{
if estado[v] == NO_VISITADO then
{
estado[v] = VISITADO;
distancia[v] = distancia[u] + 1;
padre[v] = u;
Encolar(Q, v);
}
}
}
}

Hosting

Particularmente puedo comentarles que el recorrido en profundidad consiste en:

1: Tener un nodo inicio.
2: Adjuntarlo a la pila.
3: Verificar si la pila esta vacia, mientras no este vacia...
4: Tomo un nodo de la pila (en el caso de la pila el ultimo que se ingresó) y lo marco como visitado.
5: Proceso el nodo que tome del paso 4
(El proceso puede ser por ej: imprimirlo).
6: Adjunto a la pila los nodos adyacente del nodo tomado en el paso 4.
7: Regreso al paso 3, hasta que la pila este vacia.

Asi implemente el metodo.

Algorito de profundiad por Rey Salcedo

public void recorrerProfundidadI(Nodo nodoInicio){
        if(nodoInicio != null){
            pila.addNodo(nodoInicio);
            while(pila.size() > 0){
                Nodo nodoVisitado = pila.getNodo();
                if(nodoVisitado.visitado == false){
                    nodoVisitado.visitado = true;
                    System.out.print(nodoVisitado.getDato()+",");                
                    llenarPilaNodosAdyacentes(nodoVisitado);
                }
            }
        }
    }

Para el caso del recorrido en anchura, es analogo, solo tienes que remplazar la pila por una cola (tener en cuenta que en la cola el primero en entrar es el primero en salir).

Tomemos el grafo del dibujo como ejemplo:

Lo contruimos de la siguiente forma:
----------------------------------------------

public static void llenandoGrafo(){
 grafo = new Grafo();
 
 // creamos los nodos del grafo.
 grafo.adjuntarNodo(new Nodo("A"));
 grafo.adjuntarNodo(new Nodo("B"));      
 grafo.adjuntarNodo(new Nodo("C"));
 grafo.adjuntarNodo(new Nodo("D"));
 grafo.adjuntarNodo(new Nodo("F"));
       
 grafo.crearEnlaces("A","B");// de A hacia B
 grafo.crearEnlaces("B","A");// de B hacia A
 /*
  * Lo anterior lo hacemos por ser un grafo no dirigido...
  * En caso de ser un grafo con peso esto no estaria muy bien que digamos
 */
     
 grafo.crearEnlaces("A","C");
 grafo.crearEnlaces("C","A");
        
 grafo.crearEnlaces("A","F");
 grafo.crearEnlaces("F","A");
        
//grafo.crearEnlaces("B","A");//Esta enlace ya existe
//grafo.crearEnlaces("A","B");//Esta enlace ya existe
        
 grafo.crearEnlaces("B","F");
 grafo.crearEnlaces("F","B");
        
//grafo.crearEnlaces("C","A");//Esta enlace ya existe
//grafo.crearEnlaces("A","C");//Esta enlace ya existe
        
 grafo.crearEnlaces("C","D");
 grafo.crearEnlaces("D","C");
        
//grafo.crearEnlaces("D","C");//Esta enlace ya existe
//grafo.crearEnlaces("C","D");//Esta enlace ya existe
        
//grafo.crearEnlaces("F","A");//Esta enlace ya existe
//grafo.crearEnlaces("A","F");//Esta enlace ya existe
        
//grafo.crearEnlaces("F","B");//Esta enlace ya existe
//grafo.crearEnlaces("B","F");//Esta enlace ya existe

}

----------------------------------------------




Bueno y ya para terminar, corremos los algoritmo de Recorrido que nos arroga la siguiente salida:

----------------------------------------------
Recorrido en profundidad
[A]A,
[B]
[BC]
[BCF]F,C,
[BD]D,B,
----------------------------------------------
Recorrido en Amplitud
[A]A,
[B]
[BC]
[BCF]B,C,
[FD]F,D,
----------------------------------------------
Donde lo que esta en conchete es el contenido en la pila, y lo que esta afuera es lo que sale de la pila.
Para descargar codigo fuente, clic aqui.



También te puede interesar "Implementacion en Java del Algoritmo de Dijkstra"



Comenta acerca del código.




sábado, 7 de enero de 2012

Escribiendo y leyendo en un archivo de texto con java





Es un código simple escrito para ustedes, donde implemento las dos operaciones basica para este tipo de problemas, lectura y escritura de un archivo plano de texto (El resto de operaciones posibles se desprenden de estas), espero les sea de utilidad.

Aparte les dejo al final el proyecto hecho en Netbeans usando interface grafica.

Nota: En la ruta si usan Windows al igual que en Linux deben usar el "/".

Hosting
Codigo de la clase Archivo:

//Autor: Rey Salcedo Padilla
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;

public class Archivo{

 public void escribir(String ruta, String cadena){
  File archivo = new File(ruta);
   try {
    FileWriter escribirArchivo = new FileWriter(archivo, true);
    BufferedWriter buffer = new BufferedWriter(escribirArchivo);
    buffer.write(cadena);
    buffer.newLine();
    buffer.close();
   }catch (Exception ex) {
   }
 }

 public String leer(String ruta) {
  ArrayList array = new ArrayList();
  String linea = "";
  String retornar = "";
  File archivo = new File(ruta);
  try {
   FileReader leerArchivo = new FileReader(archivo);
   BufferedReader buffer = new BufferedReader(leerArchivo);
   while ((linea = buffer.readLine()) != null){
    retornar += linea + "\n";
   }
   buffer.close();
   }catch (Exception ex){
   }
 return retornar;
 }            
}




//Autor:Rey
Salcedo Padilla
public class Main{
 public static void main(String []args){
  Archivo archivo = new Archivo();
  String ruta = "/home/rey/Escritorio/ArchivoDeTexto/hola.txt";
  
   archivo.escribir(ruta,"Todos obedecen con gusto cuando el que manda es justo.");
   archivo.escribir(ruta,"Los años dan enseñanzas que los dias no alcanzan a comprender.");
 
  System.out.println(archivo.leer(ruta));
 }
}


Comenta acerca del código.




jueves, 5 de enero de 2012

Implementacion de pila y cola.


Tal vez le interese leer sobre listas enlazadas

Según lo que he aprendido, las pilas y colas no son estructura de datos, mas bien son formas de acceder a la información contenida en una estructura de dato como puede ser una lista o vector, entre otras.

Definiciones: 

Una pila (stack en inglés) es una lista ordinal o estructura de datos en la que el modo de acceso a sus elementos es de tipo LIFO (del inglés Last In First Out, último en entrar, primero en salir) que permite almacenar y recuperar datos. (por wikipedia).


Operaciones de la pila: Una pila cuenta con 2 operaciones imprescindibles: apilar y desapilar, a las que en las implementaciones modernas de las pilas se suelen añadir más de uso habitual.
Crear: se crea la pila vacía (size).
Apilar: se añade un elemento a la pila.(push)
Desapilar: se elimina el elemento frontal de la pila.(pop)
Cima: devuelve el elemento que esta en la cima de la pila. (top o peek)
Vacía: devuelve cierto si la pila está vacía o falso en caso contrario (empty).


Una cola (también llamada fila) es una estructura de datos (no estoy deacuerdo), caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza por un extremo y la operación de extracción pop por el otro. También se le llama estructura FIFO (del inglés First In First Out), debido a que el primer elemento en entrar será también el primero en salir.(por wikipedia)


Operaciones Básicas de una Cola
Crear: se crea la cola vacía.
Encolar (añadir, entrar, insertar): se añade un elemento a la cola. Se añade al final de esta.
Desencolar (sacar, salir, eliminar): se elimina el elemento frontal de la cola, es decir, el primer elemento que entró.
Frente (consultar, front): se devuelve el elemento frontal de la cola, es decir, el primer elemento que entró.
Vacía: devuelve cierto si la pila está vacía o falso en caso contrario (empty).

Tal vez tambien te interese esto: Implementacion de una lista simple enlazada.


Mas informacion: Pila, cola.


 

Codigo Pila:

//Autor: Rey Salcedo Padilla
import java.util.ArrayList;
public class Pila extends ArrayList{
 
 //se añade un elemento a la pila.(push)
 public void apilar(Object dato){
  if(dato != null){
   this.add(dato);
  }else{
   System.out.println("Introduzca un dato no nulo");
  }  
 }
 
 //se elimina el elemento frontal de la pila.(pop)
 public void desapilar(){
  if(size() > 0){
   this.remove(this.size()-1);
  }
 }
 
 //devuelve el elemento que esta en la cima de la pila. (top o peek)
 public Object cima(){
  Object datoAuxiliar = null;
  if(this.size() > 0){
   datoAuxiliar = this.get(this.size()-1);
  }
  return datoAuxiliar;  
 }
 
 //devuelve cierto si la pila está vacía o falso en caso contrario (empty).
 public boolean vacia(){
  return this.isEmpty();
 }
}





//Autor:Rey Salcedo Padilla
import java.util.ArrayList;
public class Cola extends ArrayList{
 
 //se añade un elemento a la cola. Se añade al final de esta.
 public void encolar(Object dato){
  if(dato != null){
   this.add(dato);
  }else{
   System.out.println("Introduzca un dato no nulo");
  }  
 }

 //se elimina el elemento frontal de la cola, es decir, el primer elemento que entró.
 public void desencolar(){
  if(this.size() > 0){
   this.remove(0);
  }
 }
 
 //se devuelve el elemento frontal de la cola, es decir, el primer elemento que entró.
 public Object frente(){
  Object datoAuxiliar = null;
  if(this.size() > 0){
   datoAuxiliar = this.get(0);
  }
  return datoAuxiliar;  
 }
 
 //devuelve cierto si la pila está vacía o falso en caso contrario (empty).
 public boolean vacia(){
  return this.isEmpty();
 }
}





//Autor:Rey Salcedo Padilla
public class Main{
 public static void main(String []args){
  
  System.out.println("------Pila------");
  Pila pila = new Pila();
  pila.apilar("A");
  pila.apilar("B");
  pila.apilar("C");
  pila.apilar("D");
  
  System.out.println("Esta vacia la pila?:" + pila.vacia());
  System.out.println("Tamaño de la pila:" + pila.size());
  
  System.out.println(pila.cima());
  pila.desapilar();
  System.out.println(pila.cima());
  pila.desapilar();
  System.out.println(pila.cima());
  pila.desapilar();
  System.out.println(pila.cima());
  pila.desapilar();
  
  System.out.println("Esta vacia la pila?:" + pila.vacia());
    
  System.out.println("------Cola------");
  Cola cola = new Cola();
  cola.encolar("A");
  cola.encolar("B");
  cola.encolar("C");
  cola.encolar("D");
  
  System.out.println("Esta vacia la cola?:" + cola.vacia());
  System.out.println("Tamaño de la cola:" + cola.size());
  
  System.out.println(cola.frente());
  cola.desencolar();
  System.out.println(cola.frente());
  cola.desencolar();
  System.out.println(cola.frente());
  cola.desencolar();
  System.out.println(cola.frente());
  cola.desencolar();
  
  System.out.println("Esta vacia la cola?:" + cola.vacia());
 }
}



Invertir el contenido de un vector o arreglo:





Invertir el contenido de un vector o arreglo
Es un problema basico, pero veo que en muchas parte lo preguntan, asi que lo escribir, espero sea de utilidad.
Código:


//Autor: Rey Salcedo Padilla
public class InvertirVector{
 public static int []invertir(int []vector){
  int longitud = vector.length;
  
  /*creo un vector auxuliar con la misma longitud
  del vector a invertir*/
  int []vectorAuxiliar = new int[longitud];
  
  for(int i = 0; i < longitud; i++){
   /*la razon del - 1, es porque la posicion de un
    vector de n longitud (tamaño) es n - 1; ejemplo:
    la ultima posicion de un vector de longitud 5
    es 4
   */
   vectorAuxiliar[(longitud - 1) - i] = vector[i];
  }
  return vectorAuxiliar;
 }
  
 public static void imprimirVector(int []vector){
  for(int i = 0; i < vector.length; i++){
   System.out.print(vector[i] + ",");
  }
 }
 public static void main (String []args){
  int [] vector = {1,2,3,4,5,6,7,8,9};
  imprimirVector(vector);
  System.out.println();
  imprimirVector(invertir(vector));
 }
}


Comenta acerca del código.

Hosting

viernes, 30 de diciembre de 2011

Multiplicación de matrices:





Multiplicación de matrices
Definición de matriz: En matemáticas, una matriz es un arreglo bidimensional de números, y en su mayor generalidad de elementos de un anillo. Las matrices se usan generalmente para describir sistemas de ecuaciones lineales, sistemas de ecuaciones diferenciales o representar una aplicación lineal (dada una base). Las matrices se describen en el campo de la teoría de matrices.

Pueden sumarse, multiplicarse y descomponerse de varias formas, lo que también las hace un concepto clave en el campo del álgebra lineal.
(Por wikipedia).

Mas informacion sobre multiplicacion de matrices aqui.

Hosting

Codigo:

//Autor: Rey Salcedo Padilla
class MultiplicacionMatrices{
 
 //Me extrae una fila dada de una matriz en forma de vector (arreglo)
 public static int []filaMatriz(int [][]matriz, int fila){
  int []arregloAuxiliar = new int[matriz[fila].length];
  for(int i = 0; i < arregloAuxiliar.length; i++){
   arregloAuxiliar[i] = matriz[fila][i];
  }
  return arregloAuxiliar;
 }
 
 //Me extrae una columna dada de una matriz en forma de vector (arreglo)
 public static int []columnaMatriz(int [][]matriz, int columna){
  int []arregloAuxiliar = new int[matriz.length];
  for(int i = 0; i < arregloAuxiliar.length; i++){
   arregloAuxiliar[i] = matriz[i][columna];
  }
  return arregloAuxiliar;
 }
 
 //Me devuelve el valor de una celda segun la multiplicacion de dos matrices
 public static int valorCelda(int [][]matrizA, int [][]matrizB, int fila, int columna){
  int suma = 0;
  /*
  Tomo la fila de la primera matriz y la columna de la segunda matriz,
  para posteriormente multiplicar celda por celda
   */
  int []filaMatrizA = filaMatriz(matrizA, fila);
  int []columnaMatrizB = columnaMatriz(matrizB, columna);  
  
   for(int i = 0; i < filaMatrizA.length; i++){
    
    /*
     * Aqui valido que la longitud de ambos vectores sean iguales,
     * en terminos mas acordes, que el numero de columnas de la primera matriz,
     * sea igual al numero de filas de la segunda matriz    
    */
    
    if(filaMatrizA.length == columnaMatrizB.length){
    suma += filaMatrizA[i] * columnaMatrizB[i];
    }else{
     System.out.println("El numero de columnas de la primera matriz es diferente al numero de filas de la segunda matriz");
     break;   
    }      
   }  
    
  return suma;
   }
   
   //Me devuelve una matriz, producto de la multiplicacion de dos matrices
 public static int [][]multiplicacionMatriz(int [][]matrizA, int [][]matrizB){
  int [][]matrizAuxiliar = new int[matrizA.length][matrizA[0].length];
  for(int i = 0; i < matrizA.length; i++){
   for(int j = 0; j < matrizA[i].length; j++){
    matrizAuxiliar[i][j] = valorCelda(matrizA, matrizB, i, j);     
   }
  }
  return matrizAuxiliar; 
 }
 //imprime los valores de una matriz
 public static void imprimirMatriz(int [][]matriz){
  System.out.println("-------------------------------");
  for(int i = 0; i < matriz.length; i++){
   for(int j = 0; j < matriz[i].length; j++){
    System.out.print(matriz[i][j]+"\t");
   }
   System.out.println();
  }
  System.out.println("-------------------------------");
 }
 
 //imprime el procedimiendo de la 'matriz de recorrido' de una matriz
 public static void main(String []args){
  /*
  Nota importante:
  - Sean las matrices A y B; A tenga el mismo número de columnas que B de filas para que  exista A*B
  - Sean las matrices B y A; B tenga el mismo número de columnas que A de filas para que  exista A*B
  */
  int [][]matrizA ={{1,0,0,1},
        {1,4,0,1},
        {1,9,0,11},
        {1,5,6,0}};
        
  int [][]matrizB ={{11,0,0,1},
        {1,8,0,1},
        {0,9,0,5},
        {1,7,6,0}};
  
  System.out.println("Matriz A");      
  imprimirMatriz(matrizA);
  
  System.out.println("Matriz B");      
  imprimirMatriz(matrizB);
  
  System.out.println("Matriz A * Matriz B");   
  imprimirMatriz(multiplicacionMatriz(matrizA,matrizB));
  
  
  //Note que si A y B son diferentes A*B diferente de B*A (A*B <> B*A)
  System.out.println("Matriz B * Matriz A");   
  imprimirMatriz(multiplicacionMatriz(matrizB,matrizA));
 }

}


Comenta acerca del código.




jueves, 8 de diciembre de 2011

Implementacion de una lista simple enlazada.


Tal vez le interese leer también sobre pilas y colas
Definición auspiciada por Wikipedia: una lista enlazada es una de las estructuras de datos fundamentales, y puede ser usada para implementar otras estructuras de datos. Consiste en una secuencia denodos, en los que se guardan campos de datos arbitrarios y una o dos referencias (punteros) al nodo anterior o posterior.




Generalmente se usa una lista enlazada cuando no sabemos de antemano en numero de datos u objetos que queremos almacenar; personalmente uso en estos caso como lista un ArrayList.
Humildemente implemento en tres clases una lista sin hace uso de ninguna librería especificada por la sentencia import; espero les guste y les sirva.

//Autor: Rey Salcedo
 public class Nodo{

 private Object dato;
 private Nodo nodo;
 
 public Nodo(){
  dato = null;
  Nodo nodo = null;
 }
 public Nodo(Object dato){
  this();
  this.dato = dato;  
 }
 public void setDato(Object dato){
  this.dato = dato;
 }
 
 public Object getDato(){
  return dato;
 }
 
 public void setNodo(Nodo nodo){
  this.nodo = nodo;
 }
 
 public Nodo getNodo(){
  return nodo;
 } 
}


//Autor: Rey Salcedo
 public class Lista{
 private Nodo cabecera;
 private int tamaño;
 
 public Lista(){
  tamaño = 0;
  cabecera = new Nodo();
 }
 
 public int getTamaño(){
  return tamaño;
 }
 
 public boolean addDato(Object dato){
  Nodo nodoUltimo = getUltimoNodo();
  if(dato != null && nodoUltimo != null){
   nodoUltimo.setNodo(new Nodo(dato));
   tamaño ++;
   return true;
  }else{
   return false;
  }
 }
 
 private Nodo getUltimoNodo(){
  Nodo nodoUltimo = null;
  if(cabecera != null){
   nodoUltimo = cabecera;
   while(nodoUltimo.getNodo() != null){
    nodoUltimo = nodoUltimo.getNodo();
   }
  }
  return nodoUltimo;
 } 
 
 public Object getDato(int pos){
  Nodo nodoUltimo = null;
  int contador = 0;
  Object dato = null;
  if(cabecera != null){
   nodoUltimo = cabecera;
   do{
    nodoUltimo = nodoUltimo.getNodo();
    if(contador == pos){
     dato = nodoUltimo.getDato();
     break;
    }else{
     contador++;
    }   
   }while(nodoUltimo.getNodo() != null);
  }
  return dato;
 }
}


//Autor: Rey Salcedo
 public class Main{
 public static void main(String []args){
  Lista lista = new Lista();
  
  //Adjuntando datos
  lista.addDato("Hola");
  lista.addDato("mundo");
  lista.addDato("aqui");
  lista.addDato("estoy");
  
  System.out.println("-------Imprimiendo datos-------");
  
  for(int i = 0;i < lista.getTamaño();i ++){
   System.out.println(lista.getDato(i));
  }
 }
}

Tal vez también te interese: Implementacion de pila y cola.

Entrada destacada

Matriz de adyacencia para un grafo

"La matriz de adyacencia es una matriz cuadrada que se utiliza como una forma de representar relaciones binarias."; aunque pa...