Según la wiki: http://es.wikipedia.org/wiki/FIFO_y_LIFO_%28contabilidad%29
FIFO y LIFO son métodos contables diseñados para valorar inventarios y asuntos financieros que involucran dinero que una compañía asocia con inventario de bienes producidos, materia prima, partes o componentes.
Esto es lo que me piden en el ejercicio:
Citar:
Desarrollar la implementación de una lista del tipo pila o LIFO (Last Input First Output) y de una lista del tipo cola o FIFO (First Input First Output). Las implementaciones deben ser genéricas, es decir, deben aceptar cualquier tipo de objeto.
Además, definir un tipo genérico Pila que imponga el API genérico de una lista (añadir y extraer elementos).
La clase Actividad4 tiene un método main en el que se crearán los dos tipos de lista, se les añadirá los mismos elementos y en el mismo orden. Se comprobará el orden en el que se extraen los elementos en cada lista.
En la siguiente pagina web viene la solucion para Java
https://docs.google.com/document/pub?id=1TdCH71pyhdKELmwVo4IwQnqUtVErn85KMfOaO4ZZEAk&pli=1
La ventaja de esta solución es que no usa las colecciones "prefabricadas" que ya incorpora Java, con lo cual el código puede ser implementado a Gambas "facilmente".
Aquí podeis ver el diagrama de clases de UML, de esta solución:
Bien lo he implementado a Gambas, (gambas2: en vez de Objeto lo he implementado a Variant).
Clase ApiLista:
Código:
PUBLIC SUB anadir(Obj AS Variant)
END
PUBLIC FUNCTION extraer() AS Variant
END
PUBLIC FUNCTION getlongitud() AS Integer
END
Clase colaFifo:
Código:
' Gambas class file
INHERITS ApiLista
PRIVATE primero AS Nodo
PRIVATE ultimo AS Nodo
PRIVATE longitud AS Integer
PUBLIC SUB anadir(obj AS Variant)
DIM aux AS NEW Nodo
aux.objeto = obj
IF longitud = 0 THEN
primero = aux
ELSE
ultimo.siguiente = aux
ENDIF
ultimo = aux
longitud += 1
END
PUBLIC FUNCTION extraer() AS Variant
DIM obj AS Variant
IF longitud = 0 THEN
RETURN -111 'cola vacia
ELSE
obj = primero.objeto
primero = primero.siguiente
longitud -= 1
RETURN obj
ENDIF
END
PUBLIC FUNCTION getlongitud() AS Integer
RETURN longitud
END
Clase pilaLiFo:
Código:
' Gambas class file
INHERITS ApiLista
PRIVATE top AS Nodo
PRIVATE longitud AS Integer
PUBLIC SUB anadir(obj AS Variant)
DIM aux AS NEW Nodo
aux.objeto = obj
aux.siguiente = top
top = aux
longitud += 1
END
PUBLIC FUNCTION extraer() AS Variant
DIM obj AS Variant
IF top = NULL THEN
RETURN NULL ' lista vacia
ENDIF
obj = top.objeto
top = top.siguiente
longitud -= 1
RETURN obj
END
PUBLIC FUNCTION getlongitud() AS Integer
RETURN longitud
END
Clase Nodo:
Código:
PUBLIC objeto AS Variant
PUBLIC siguiente AS Nodo
En el Formulario FMain: (añadimos un textarea, para ver el resultado)
Código:
PUBLIC SUB Form_Open()
' obtenido de:
'https://docs.google.com/document/pub?id=1TdCH71pyhdKELmwVo4IwQnqUtVErn85KMfOaO4ZZEAk&pli=1
'java-FIFO-LIFO
DIM i AS Integer
DIM elementos AS Integer
DIM pila AS NEW pilaLiFO[]
DIM cola AS NEW colaFifo[]
' Añadimos los mismos elementos a la pila y la cola.
FOR i = 0 TO 9
pila.anadir("AB" & Str$(I))
cola.anadir("AC" & Str$(I))
NEXT
' Extraer Pila
TextArea1.text = "Orden de Extraccion de la pila LIFO:\n"
elementos = pila.getlongitud()
FOR i = 0 TO elementos - 1
TextArea1.text &= " [" & pila.extraer() & "] "
NEXT
TextArea1.text &= "\n-------\n"
'Extraer en Cola
TextArea1.text &= "Orden de Extraccion de la cola FIFO:\n"
elementos = cola.getlongitud()
FOR i = 0 TO elementos - 1
TextArea1.text &= " [" & cola.extraer() & "] "
NEXT
END
Aqui podeis ver la salida generada por el programa: