Equivalent de POP et PUSH ?

yoannwyffels Messages postés 16 Date d'inscription dimanche 12 janvier 2003 Statut Membre Dernière intervention 23 novembre 2004 - 22 nov. 2004 à 23:11
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 - 23 nov. 2004 à 18:10
Coucou,

Je souhaiterai pouvoir empiler ou dépiler des valeurs dans un tableau en Visual Basic (communément appelé Push et POP), ceci afin de traiter un tableau comme une "pile".

Peut-on le faire en VB ? Comment ?

Merci

5 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
23 nov. 2004 à 02:50
Option Explicit

'déclaration du tableau Pile
Dim Pile() As Long

Private Sub Command1_Click()
    Dim x As Long
'push des données
    PUSH 10
    PUSH 20
'pop des données
    POP x
    MsgBox x
    POP x
    MsgBox x
'dépassement de pile
    POP x
End Sub

Private Sub PUSH(valeur As Long)
    Dim n As Integer
'Pile n'est pas initialisée la première fois
    On Error Resume Next
    n = UBound(Pile)
'incrémenter
    n = n + 1
'redimentionner
    ReDim Preserve Pile(n)
'chercher valeur
    Pile(n) = valeur
End Sub

Private Sub POP(valeur As Long)
    Dim n As Integer
'aller chercher dernière valeur entrée
    n = UBound(Pile)
    valeur = Pile(n)
'si zéro on a déjà tout vidé
    If n = 0 Then
       MsgBox "La Pile est vide"
       Exit Sub
       End If
'décrémenter
    n = n - 1
'redimentionner
    ReDim Preserve Pile(n)
End Sub


Daniel
0
yoannwyffels Messages postés 16 Date d'inscription dimanche 12 janvier 2003 Statut Membre Dernière intervention 23 novembre 2004
23 nov. 2004 à 09:54
Super merci, mais comment rendre ces procédures applicables à n'importel quel tableau ? (ceci afin de réellement avoir de vrai fonction pop et push) ?
0
cs_Prince Charmant Messages postés 34 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 30 novembre 2004
23 nov. 2004 à 11:27
Salut,

tu remplaces "Valeur As Long" par "Valeur As Variant" et dans ce cas, tu peux empiler ce que tu veux.

Attention, si tu changes de type en cours de route de t'en souvenir, sinon gros pb...

A+
0
yoannwyffels Messages postés 16 Date d'inscription dimanche 12 janvier 2003 Statut Membre Dernière intervention 23 novembre 2004
23 nov. 2004 à 11:34
Ok pour les valeurs, mais pour le nom du tableau en question ?
Si par exemple je veux avoir 30 000 piles (donc concrétement 30 000 tableaux)
Avec cette méthode on a uniquement 1 tableau (nommé Pile)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
23 nov. 2004 à 18:10
Moi je te propose un e petite classe basée sur une collection de variant, plutot qu'un tableau ! Quel sont les avantages ??
1- Tu peux avoir autant de pile que tu veux avec seulement une vingtaine de ligne de code
2- Tu peux gérer des piles LIFO et FIFO
3- tu peux mettre de tout dans une meme pile : Des nombre, des string, des objets etc ....
4- C'est super simple !!
Voici le code à mettre dans un module de classe, appelé "Stack" par exemple
Option Explicit

Public Enum StackMode
    LIFO
    FIFO
End Enum

Private pColl As Collection
Private pMode As StackMode

Public Sub Push(ByVal V As Variant)
    pColl.Add V
End Sub

Public Function Pop() As Variant
Dim i As Long, j As Long
    
    i = pColl.Count
    If i > 0 Then
        If pMode = FIFO Then
            j = 1
        ElseIf pMode = LIFO Then
            j = i
        End If
        If IsObject(pColl(j)) Then
            Set Pop = pColl(j)
        Else
            Pop = pColl(j)
        End If
        pColl.Remove j
    End If
End Function

Private Sub Class_Initialize()
    Set pColl = New Collection
    pMode = LIFO
End Sub

Private Sub Class_Terminate()
    Set pColl = Nothing
End Sub

Public Property Get Mode() As StackMode
    Mode = pMode
End Property

Public Property Let Mode(ByVal Mode As StackMode)
    pMode = Mode
End Property

Et voici un bout de code pour le tester
Dim s As Stack
    
    Set s = New Stack
    s.Mode = LIFO
    s.Push "toto"
    s.Push 15
    MsgBox s.Pop
    MsgBox s.Pop


Christophe R.
0
Rejoignez-nous