Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

22.3. System.Collections.Stack

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

22.3.1. System.Collections.Stack

De System.Collections namespace voorziet in het collectietype Stack, deze heeft een eenvoudige publieke interface. De belangrijkste acties die men kan ondernemen met een Stack zijn :

- het toevoegen van een element via de Push(value As Object) method
- het verwijderen en opvragen van een element via de Pop() As Object method

Dit type is bruikbaar indien het toevoegen en verwijderen van de elementen gebeurt volgens het "LIFO" principe (Last In First Out).  Het laatst toegevoegde element is ook het element dat als eerste zal verwijderd worden.

In onderstaand voorbeeld worden enkele members uit de Stack klasse gedemonstreerd.
Visual Basic 2012 Broncode - Codevoorbeeld 524
Option Strict On

Imports System.Collections

Public Class StackExample
    Public Shared Sub Main()
        Dim stack1 As New Stack                                            ' (1)
        '
        Console.WriteLine(stack1.Count)          ' 0
        '
        stack1.Push(1)                                                     ' (2)
        stack1.Push("2"c)
        stack1.Push("three")
        Console.WriteLine(stack1.Count)          ' 3
        PrintStack(stack1)                       ' " three - 2 - 1 - "
        '
        Console.WriteLine(stack1.Contains("2"c)) ' True
        '
        Console.WriteLine(stack1.Pop())          ' "three"                   (3)
        PrintStack(stack1)                       ' " 2 - 1 - "
        Console.WriteLine(stack1.Count)          ' 2
        '
        Console.WriteLine(stack1.Peek())         ' "2"c                      (4)
        Console.WriteLine(stack1.Count)          ' 2
        '
        Console.WriteLine(stack1.Pop())          ' "2"c
        PrintStack(stack1)                       ' " 1 - "
        Console.WriteLine(stack1.Count)          ' 1
        '
        Console.ReadLine()
    End Sub
    Public Shared Sub PrintStack(ByVal stack As Collections.Stack)
        For Each element As Object In stack                                ' (5)
            If element IsNot Nothing Then
                Console.Write(element.ToString() & " - ")
            End If
        Next
        Console.WriteLine()
    End Sub
End Class
Console Application Output
0
3
three - 2 - 1 -
True
three
2 - 1 -
2
2
2
2
1 -
1
(1) : Stack instanties hebben geen initiële capaciteit.

(2) : De Push() method is bruikbaar om elementen van eender welk datatype toe te voegen aan de Stack instantie.

(3) : De Pop() method verwijderd het laatst toegevoegde element en levert het laatst toegevoegde element in Object vorm op.  Dit is dus een method die zowel een waarde oplevert (een "query") als een method die de toestand van het object wijzigt (een "command").

(4) : De Peek() method zal net als de Pop() method het laatst toegevoegde element in Object vorm opleveren, maar zal in tegenstelling met de Pop() method het laatst toegevoegde element niet verwijderen.

(5) : Ook de elementen van een Stack instantie zijn benaderbaar met een For Each iteratie.  De elementen worden hierbij overlopen in dezelfde volgorde als ze zouden verwijderd ("gepopped") worden uit de Stack.

22.3.2. Collection Contains gebruikt Element Equals

Traditioneel gebruiken collecties voor hun implementaties van members die op zoek gaan naar elementen, zoals de Contains method, de Equals implementatie van de elementen om na te gaan of een element gelijk is aan de parameter.

Indien in onderstaand voorbeeld logische gelijkheid niet hetzelfde is als fysieke gelijkheid tussen personen, dan moeten we in het type Person de van Object overgeërfde Equals method overschrijven om aan te geven waarop logische gelijkheid wordt gebaseerd :
Visual Basic 2012 Broncode - Codevoorbeeld 525
Namespace StackContainsExample
    Public Class Person
        Public Property Name As String
        Public Overrides Function Equals(ByVal obj As Object) As Boolean
            If obj IsNot Nothing AndAlso TypeOf obj Is Person Then
                Equals = Name.Equals(DirectCast(obj, Person).Name)
            End If
        End Function
        Public Overrides Function GetHashCode() As Integer
            GetHashCode = Name.GetHashCode()
        End Function
    End Class
    Public Class Client
        Public Shared Sub Main()
            Dim person1 As New Person With {.Name = "John"}
            Dim person2 As New Person With {.Name = "Jane"}
            Dim person3 As New Person With {.Name = "John"}
            '
            Dim stack1 As New Stack
            stack1.Push(person1)
            stack1.Push(person2)
            '
            Console.WriteLine(stack1.Contains(person3)) ' True
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Persoon person3 die in bovenstaand voorbeeld dezelfde naam heeft als person1, of met andere woorden logisch als gelijk wordt beschouwd, zal er als parameter voor de Contains method toe leiden dat deze method True resulteert.
Console Application Output
True

22.3.3. Typesafe System.Collections.Generic.Stack(Of T)

Indien het type van de elementen van de Stack vastligt, kan men beter een typesafe variant van Stack gebruiken, namelijk Stack(Of T).

Voor meer details over dergelijke generieke collectietypes en typesafe collecties, zie de desbetreffende topics.

22.3.4. Oefening

Opgave :

Maak zelf een eenvoudige versie van een Stack klasse.  Respecteer het het "command/query seperation pattern".  De Peek() method dient zoals in de voorgedefinieerde klasse Stack voor het opvragen van het volgende te "poppen" element.  Maar in tegenstelling tot in de voorgedefinieerde Stack klasse zal de Pop() method enkel het laatste toegevoegde element verwijderen en geen element opleveren.

Gebruik een gewone array als interne datastructuur.

Zorg ervoor dat onderstaande clientcode bijhorende output geeft.
Visual Basic 2012 Broncode - Codevoorbeeld 526
Namespace Exercise
    Public Class Client
        Public Shared Sub Main()
            Dim stack1 As Stack = New Stack
            '
            Console.WriteLine(stack1.Count)  ' 0
            '
            stack1.Push(1)
            stack1.Push("2"c)
            stack1.Push("three")
            Console.WriteLine(stack1.Count)  ' 3
            '
            Console.WriteLine(stack1.Peek()) ' "three"
            stack1.Pop()
            Console.WriteLine(stack1.Count)  ' 2
            '
            Console.WriteLine(stack1.Peek()) ' "2"c
            stack1.Pop()
            Console.WriteLine(stack1.Count)  ' 1
            '
            Console.WriteLine(stack1.Peek()) ' 1
            stack1.Pop()
            Console.WriteLine(stack1.Count)  ' 0
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Console Application Output
0
3
three
2
2
1
1
0
Oplossing :
Visual Basic 2012 Broncode - Codevoorbeeld 527
Namespace Exercise
    Public Class Stack
        Private _Items As Object()
        Public ReadOnly Property Count() As Integer
            Get
                If _Items IsNot Nothing Then Count = _Items.Length
            End Get
        End Property
        Public Sub Push(ByVal value As Object)
            ReDim Preserve _Items(Count)
            _Items(Count - 1) = value
        End Sub
        Public Function Peek() As Object
            Peek = _Items(Count - 1)
        End Function
        Public Sub Pop()
            ReDim Preserve _Items(Count - 2)
        End Sub
    End Class
End Namespace

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.