Gestion efficace d'une pile/file par classe et tableau dynamique

Soyez le premier à donner votre avis sur cette source.

Vue 5 860 fois - Téléchargée 613 fois

Description

La classe que je vous propose permet de gérer une pile (LIFO : Last In First Out) ou une file (FIFO : First In First Out). Contrairement à la plupart des sources que j'ai pu voir sur ce site, je n'utilise pas de collection mais plutôt un tableau (j'ai choisi un tableau de long mais vous pouvez remplacer par n'importe quel type de données).
Lorsque le tableau est plein, un simple ReDim Preserve permet d'allonger la structure, la taille par défaut étant fixée dans la constante BUFFER_SIZE.

Je précise que l'idée originale provient de http://www.paradoxes.info/code/StackClass.html qui propose une classe qui ne fonctionne toutefois qu'en mode LIFO.

Source / Exemple :


' *************************************************************
' Programmeur :             Egyde (sendoval_fr@yahoo.fr)
' Dernière mise à jour :    23/06/05
' *************************************************************
Option Explicit

Private Const BUFFER_SIZE   As Long = 1000

Private Stack()             As Long
Private Index               As Long
Private Index_FIFO          As Long

' renvoi true ssi la pile est vide
Public Property Get IsEmpty() As Boolean
    If Index = 0 Then IsEmpty = True ' les éléments sont stockés à partir de l'index 1
End Property

' renvoi le nb d'élément(s) empilé(s)
Public Property Get Length() As Long
    Length = Index - Index_FIFO
End Property

' initialise la pile
Public Sub Clear()
    ReDim Stack(BUFFER_SIZE)
    Index = 0
    Index_FIFO = 0
End Sub

' pose un élément sur la pile
Public Sub Push(ByVal lng As Long)
    '
    If Index = UBound(Stack) Then
        ' on augmente la taille de la pile
        ReDim Preserve Stack(Index + BUFFER_SIZE)
    End If
    '
    ' on pose l'élément sur la pile
    Index = Index + 1
    Stack(Index) = lng
    '
End Sub

' récupère un élément de la pile selon le mode "First In First Out"
Public Function PopFIFO() As Long
    '
    If Index > 0 And Index_FIFO < Index Then
        Index_FIFO = Index_FIFO + 1
        PopFIFO = Stack(Index_FIFO)
    End If
    '
    If Index_FIFO = Index Then
        ' pas la peine d'allonger la pile... On recommence à zéro
        Index_FIFO = 0
        Index = 0
    End If
    '
End Function

' récupère un élément de la pile selon le mode "Last In First Out"
Public Function PopLIFO() As Long
    '
    If Index > Index_FIFO Then
        PopLIFO = Stack(Index)
        Index = Index - 1
    End If
    '
    If Index_FIFO = Index Then
        ' pas la peine d'allonger la pile... On recommence à zéro
        Index_FIFO = 0
        Index = 0
    End If
    '
End Function

Private Sub Class_Initialize()
    Clear
End Sub

Private Sub Class_Terminate()
    Erase Stack
End Sub

Conclusion :


Les débutants trouveront dans le .zip un exemple détaillé d'utilisation.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.