Logo Revista Java

startjavaabout

articles

00. Prólogo (java)
01.a TEMAS INTRODUCTORIOS. (java)
01.b Comandos que Inician la Máquina de Java y la salida de texto (java)
01.c Descripción empírica de la Programación Orientada a Objetos con Java. (java)
01.d Herencia Soportada por Java y Tipos de Datos Básicos. (java)
01.e Operadores, Delimitadores Básicos Y los nombres de función Válidos. (java)
02.a Codificación Inicial y Estructuras de Datos. (java)
02.b Paquetes, y Palabras clave, (Reservadas) (java)
02.c Tipos de Datos, y declaraciones de funciones, Tablas. (java)
02.d Bucles y Tomas de decisión, Excepciones y Control de Errores. (java)
02.e Secuencias de Escape (java)
02.f Concatenación y Conversiones a Texto. (java)
02.g Métodos de Entrada y Salida de datos (java)
02.h Crear Objetos de la biblioteca de Java (java)
02.i Ejercicio: Entrada de Datos y Conversiones (if, try, catch) (java)
02.j Ejercicios, usando excepciones y while, y switch (java)
02.k Práctica complementaria Resuelta sin Arreglos. (java)
02.l Ejercicios de la práctica complementaria (java)
02.m Práctica complementaria resuelta Ej 6 y 7 (java)
02.m Práctica complementaria resuelta Ej 8 y 9 (java)
03.a Métodos estáticos y mecanismos de programación (java)
03.b Arreglos (Arrays o Vectores) (java)
03.c La clase Math como ayudante para resolver problemas (java)
03.d Usando arreglos para un buffer, colas de espera, pilas y listas. (java)
03.e Implementación del buffer tipo FIFO (Cola de espera, el primero es primero en salir) (java)
03.f Implementación del buffer tipo FIFO (Cola de espera, el primero es primero en salir) 2da parte (java)
03.g Implementación del buffer tipo LIFO (La pila, último en llegar es primero en salir) (java)
03.h Implementación del buffer tipo LIFO (La pila, último en llegar es primero en salir) 2da parte (java)
03.i Implementación de una Lista de datos. (java)
03.j Búsqueda Secuencial dentro de la lista de datos. (java)
03.k Búsqueda Aleatoria dentro de la lista de datos. (java)
03.l Búsqueda binaria dentro de una lista ordenada de datos. (java)
03.m Método para Ordenar - La Burbuja (java)
03.n Método para Ordenar - QuickSort Recursivo (java)
03.o Ejercicios Resueltos, ordenar con Java (java)
04.a Nuestro primer Objeto en Java (java)
04.b Codificación del primer Objeto en Java (java)
La bibliotecaria recibirá libros nuevos para catalogar y los enviará a apilar en el escritorio de la asistente, la asistente tendrá un minuto para leer el nombre de la etiqueta que envió la biblioteca

03.g Implementación del buffer tipo LIFO (La pila, último en llegar es primero en salir)

(324)
La bibliotecaria recibirá libros nuevos para catalogar y los enviará a apilar en el escritorio de la asistente, la asistente tendrá un minuto para leer el nombre de la etiqueta que envió la biblioteca
contact
Created,Modified
2009-04-02 11:53:56, 2009-05-07 19:09:58
Author,Nick
Gustavo Guillermo Perez, (madgus) [myblog]

Implementación del buffer tipo LIFO (La pila, último en llegar es primero en salir)

Modifiquemos el ejemplo anterior para que ahora sean una bibliotecaria y su asistente, la bibliotecaria recibirá libros nuevos para catalogar y los enviará a apilar en el escritorio de la asistente, la asistente tendrá un minuto para leer el nombre de la etiqueta que envió la bibliotecaria a través de la red y ordenarlo, es visto que los libros ahora saldrán en forma de pila y no cola de espera, el límite será la altura de la asistente que hace las tarjetas sentada, pero no lo calcularemos :p.

Libros en total 24, se envía el contenido de la tarjeta en modo texto.

Asistente:

gus@gusgus ~$ java com.compunauta.aprendiendojava.Cap3_lifo_asis

Escuchando el puerto:4567

Esperando conexión...

Conectado... Esperando títulos

Libro:Introducción a la física

No hay más, nos vamos cuando terminemos...

Libro:Aprendiendo Java

Libro:Lectura I

Libro:Asambleas

Ya no es necesario esperar, terminado...

gus@gusgus ~$


Bibliotecaria:

gus@gusgus ~$ java com.compunauta.aprendiendojava.Cap3_lifo_bib

Intentando conectar con la asistente

Nos conectamos con la asistente:127.0.0.1:4567

Ingrese Títulos (línea vacía termina)

Introducción a la física

Asambleas

Lectura I

Aprendiendo Java

Programa terminado

gus@gusgus ~$


Asistente:

  1. package com.compunauta.aprendiendojava;

  2. import java.io.*;

  3. import java.net.*;

  4. /**

  5. * <p>Título: Aprendiendo Java</p>

  6. * <p>Descripción: Ejemplos del Libro Aprendiendo Java de Compunauta</p>

  7. * <p>Copyright: Copyright (c) 2006 www.compunauta.com</p>

  8. * <p>Empresa: COMPUNAUTA</p>

  9. * @author Gustavo Guillermo Pérez

  10. * @version 2006.01.01

  11. */

  12. public class Cap3_lifo_asis {

  13. //Declaramos unas variables globales a este tipo de datos

  14. public static int PORT=4567;

  15. public static int BUFF_SIZE=24;

  16. public static int TIMER_SLEEP=60*1000; //60sx1000ms

  17. public static int buff_elem=0;

  18. public static String[] buffer=new String[BUFF_SIZE];

  19. public static void main(String[] args) {

  20. //Declaramos la variable socket (será un puntero a objeto)

  21. Socket skt=(Socket)null;

  22. //Declaramos vacío el servidor de sockets para inicializarlo

  23. ServerSocket Ss=(ServerSocket)null;

  24. //Tratamos de escuchar el puerto definido por la variable PORT

  25. System.err.println("Escuchando el puerto:"+PORT);

  26. try {Ss = new ServerSocket(PORT);}

  27. catch (IOException ex) {

  28. System.out.println("El sistema no permite abrir el puerto");

  29. System.exit(-1);}

  30. //Si no ocurrió error arriba entonces esperamos a la secretaria

  31. System.err.println("Esperando conexión...");

  32. try {skt = Ss.accept();}

  33. catch (IOException ex1) {

  34. ex1.printStackTrace(System.err);

  35. System.exit(-1);}

  36. //Si no ocurrió error arriba la secretaria está lista para enviar

  37. System.err.println("Conectado... Esperando títulos");

  38. try {

  39. BufferedReader datos = new BufferedReader(new InputStreamReader((skt.getInputStream())));

  40. long timer=0;

  41. boolean timer_on=false;

  42. boolean ultimo=false;

  43. while (true){

  44. if(!ultimo && (skt.isClosed() || ((buff_elem>0) && buffer[buff_elem-1]!=null && buffer[buff_elem-1].equals("fin")))){

  45. //Terminamos el programa si la bibliotecaria terminó

  46. System.err.println("No hay más, nos vamos cuando terminemos...");

  47. //el libro fin no se debe guardar es el aviso

  48. buff_elem--;

  49. ultimo=true;

  50. }

  51. if(ultimo && (buff_elem==0)){

  52. System.err.println("Ya no es necesario esperar, terminado...");

  53. System.exit(0);}

  54. //si hay títulos los guardamos

  55. if(!ultimo && datos.ready()){

  56. put_tit(datos.readLine());}

  57. if(timer_on){

  58. //si el timer funciona no hacer nada, si se pasó pararlo

  59. if ((timer+TIMER_SLEEP)<System.currentTimeMillis()){timer_on=false;}

  60. }else{

  61. //Si el timer está apagado, mostramos un tel si es que hay

  62. if (buff_elem>0){System.out.println("Libro:"+get_tit());

  63. //Encendemos el timer y guardamos la hora en que empezó

  64. timer_on=true;

  65. timer=System.currentTimeMillis();}

  66. }

  67. //Pausamos 100ms para no sobrecargar el procesador

  68. try {Thread.sleep(100);}

  69. catch (InterruptedException ex3) {}

  70. }//fin del bloque eterno

  71. }catch (Exception ex2) {

  72. ex2.printStackTrace(System.err);

  73. System.exit(-1);

  74. }

  75. }//fin del método principal

  76.  

  77. //Funciones o métodos auxiliares

  78. public static void put_tit(String tit){

  79. //Si se supera el espacio producir un error

  80. if (BUFF_SIZE<(buff_elem+1)){

  81. System.err.println("Buffer overrun: El buffer se llenó demasiado rápido");

  82. System.exit(-1);}

  83. //guardamos el tel y aumentamos en uno el contador

  84. buffer[buff_elem++]=tit;

  85. }

  86. public static String get_tit(){

  87. //quitamos uno al contador de elementos

  88. //devolvemos el último libro

  89. return buffer[--buff_elem];

  90. }

  91. }//final de la clase

 

Descripción del funcionamiento:

La declaración de variables globales a la clase o tipo de datos se realiza entre las líneas 15 y 19.

El método principal comienza en la línea 21, y declaramos los objetos del tipo Socket y ServerSocket como en el apartado anterior.

Desde la línea 28 a la 32 intentamos abrir el puerto para escuchar conexiones entrantes, si sucede un error nos salimos.

Si no hay errores, entre la línea 35 y 38 esperamos una conexión entrante con su respectivo bloque de control de errores.

Como la función accept();detendrá el programa hasta que arribe una conexión, si estamos ejecutando el bloque principal entre las líneas 43 y siguientes, es porque se recibió una conexión. En el respectivo bloque de control de errores iniciamos el flujo de datos que usaremos para ir recibiendo renglones, en este caso usamos el mismo tipo de objeto que nos permite leer líneas desde el teclado, solo que ahora las leeremos desde la conexión de red.

Declaramos algunas cuantas variables para crear nuestro temporizador de 1 minuto igual que en el ejemplo anterior, y definimos una variable ultimo que nos avisará cuando los libros son todos.

En este caso la bandera que usamos para saber que hemos terminado por parte de la bibliotecaria es la palabra clave “fin”, y por supuesto revisamos que la conexión no esté cerrada, que haya elementos y todo eso antes de proceder a retirar un libro del buffer y enseñarlo en pantalla. La bandera binaria ultimo solo se activará en la condición anterior para asegurar que seguiremos mostrando títulos mientras, es una variación respecto del ejemplo anterior para ver otras maneras de resolver algo similar.

Si, el ultimo elemento ya llegó y no hay más en la memoria temporal, entonces nos salimos del programa. (líneas 56-58).

Si no es el ultimo elemento y hay datos disponibles en el flujo de datos de red, entonces leer una línea y ponerla en la memoria temporal.

Si el timer está encendido entonces procedemos igual que antes, el único cambio sustancial serán las funciones que guardan y extraen los datos del buffer.

La única función que cambia es la que quita elementos del buffer, que es mucho más simple que antes.

return buffer[--buff_elem];

Donde estamos decrementando el contador de elementos antes (el -- está a la izquierda) y como sabemos que los arreglos se acceden desde el 0 a cantidad-1 entonces es correcto el resultado devuelto.


leavecomment

*Hasta que esta leyenda no desaparezca el libro no ha sido terminado, descarge en pdf:

http://compunauta.com/forums/linux/programacion/java/ebook.html




Aprendiendo Java - Ejemplos resueltos, Ejercicios, prácicas y técnicas de programación con Java #1 - ezine - ©Compunauta - myblog - Anuncios - 1072