Public Enum enTipoPila
PILATIPO_FILO = 1 ' primero en entrar último en salir
PILATIPO_FIFO = 2 ' primero en entrar primero en salir.
PILATIPO_AMBOS = 3 ' se decide de qué extremo queremos sacar indistintamente
End Enum
Public Enum enExtremo
EXTREMO_INICIAL = 0
EXTREMO_FINAL = 1
End Enum
' =========== CAMPOS DE LAS PROPIEDADES ================
Private p_Pila As New Collection
Private p_TipoPila As enTipoPila
' =========== PROPIEDADES DE LA CLASE ==================
Public Property Get TipoPila() As enTipoPila
TipoPila = p_TipoPila
End Property
Public Property Let TipoPila(ByVal tp As enTipoPila)
p_TipoPila = tp
End Property
Public Property Get Count() As Long
Count = p_Pila.Count
End Property
'============= MÉTODOS públicos DE LA PILA =============
' la pila siempre añade al final
Public Sub Push(ByRef Elemento As Variant)
p_Pila.Add (Elemento)
End Sub
' en 'nuestra' pila podremos quitar del inio, del final o de ambos...
' es una pila 'especial'...
' extremos sólo es necesario para el caso de la pila de extraer de 'ambas partes indistintamente
Public Function Pop(Optional Extremo As enExtremo = EXTREMO_INICIAL) As Variant
If p_Pila.Count > 0 Then ' sólo si la pila tiene elementos devolvemos...
Select Case p_TipoPila
Case enTipoPila.PILATIPO_FILO
Pop = PopFilo
Case enTipoPila.PILATIPO_FIFO
Pop = PopFifo
Case enTipoPila.PILATIPO_AMBOS
'If IsMissing(Extremo) Then Extremo = EXTREMO_INICIAL '
If Extremo = EXTREMO_FINAL Then
Pop = PopFilo
Else ' toma del principio.
Pop = PopFifo
End If
End Select
Else ' quitar elementos de una colección vacía origina un error,ocasionalmente podría sustituirse por on local error resume next..
' no devuelve elementos
Pop = "No elementos"
End If
End Function
'============= MÉTODOS privados DE LA PILA =============
' pop siempre devuelve un elemento y luego lo elimina, en este caso del final
Private Function PopFilo() As Variant
PopFilo = p_Pila.Item(p_Pila.Count)
p_Pila.Remove (p_Pila.Count)
End Function
' pop siempre devuelve un elemento y luego lo elimina, en este caso del inicio.
Private Function PopFifo() As Variant
PopFifo = p_Pila.Item(1) ' las colecciones se basan en índice 1
p_Pila.Remove (1)
End Function
'============== MÉTODOS DE LA CLASE ==================
Private Sub Class_Initialize()
p_TipoPila = PILATIPO_FILO ' puesto que los valores van del 1 al 3, 0 no se admite.
End Sub
Private Sub Class_Terminate()
Set p_Pila = Nothing
End Sub