|
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
22.3.1. System.Collections.StackDe 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 2010 Broncode Option Strict OnImports System.Collections Public Class StackExample Public Shared Sub Main() Dim stack1 As New Stack Console.WriteLine(stack1.Count) stack1.Push(1) stack1.Push( "2"c) stack1.Push( "three") Console.WriteLine(stack1.Count) PrintStack(stack1) Console.WriteLine(stack1.Contains( "2"c)) Console.WriteLine(stack1.Pop()) PrintStack(stack1) Console.WriteLine(stack1.Count) Console.WriteLine(stack1.Peek()) Console.WriteLine(stack1.Count) Console.WriteLine(stack1.Pop()) PrintStack(stack1) Console.WriteLine(stack1.Count) Console.ReadLine() End Sub Public Shared Sub PrintStack( ByVal stack As Collections. Stack) For Each element As Object In stack If element IsNot Nothing Then Console.Write(element.ToString() & " - ") End If Next Console.WriteLine() End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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. boven
22.3.2. Collection Contains gebruikt Element EqualsTraditioneel 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 2010 Broncode Namespace StackContainsExample Public Class Person Private _Name As String Public Property Name() As String Get Name = _Name End Get Set( ByVal value As String) _Name = value End Set End Property 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)) Console.ReadLine() End Sub End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 boven
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. boven
22.3.4. OefeningOpgave :
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 2010 Broncode Namespace Exercise Public Class Client Public Shared Sub Main() Dim stack1 As Stack = New Stack Console.WriteLine(stack1.Count) stack1.Push(1) stack1.Push( "2"c) stack1.Push( "three") Console.WriteLine(stack1.Count) Console.WriteLine(stack1.Peek()) stack1.Pop() Console.WriteLine(stack1.Count) Console.WriteLine(stack1.Peek()) stack1.Pop() Console.WriteLine(stack1.Count) Console.WriteLine(stack1.Peek()) stack1.Pop() Console.WriteLine(stack1.Count) Console.ReadLine() End Sub End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output 0
3
three
2
2
1
1
0 Oplossing : Visual Basic 2010 Broncode Namespace Exercise Public Class Stack Private m_Items As Object() Public ReadOnly Property Count() As Integer Get If m_Items IsNot Nothing Then Count = m_Items.Length End Get End Property Public Sub Push( ByVal value As Object) ReDim Preserve m_Items(Count) m_Items(Count - 1) = value End Sub Public Function Peek() As Object Peek = m_Items(Count - 1) End Function Public Sub Pop() ReDim Preserve m_Items(Count - 2) End Sub End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|