VB.Net Tutorial/Collections/Your Stack
Define your own Stack class based on List
<source lang="vbnet">Public Class List
Private firstNode As Node Private lastNode As Node Private name As String Public Sub New(ByVal listName As String) name = listName firstNode = Nothing lastNode = Nothing End Sub Public Sub New() MyClass.New("list") End Sub " New Public Sub InsertAtFront(ByVal insertItem As Object) SyncLock (Me) If IsEmpty() Then lastNode = New Node(insertItem) firstNode = lastNode Else firstNode = New Node(insertItem, firstNode) End If End SyncLock End Sub Public Sub InsertAtBack(ByVal insertItem As Object) SyncLock (Me) If IsEmpty() Then lastNode = New Node(insertItem) firstNode = lastNode Else lastNode.NextNode = New Node(insertItem) lastNode = lastNode.NextNode End If End SyncLock End Sub Public Function RemoveFromFront() As Object SyncLock (Me) Dim removeItem As Object = Nothing If IsEmpty() Then Throw New EmptyListException(name) End If removeItem = firstNode.Data If firstNode Is lastNode Then firstNode = Nothing lastNode = Nothing Else firstNode = firstNode.NextNode End If Return removeItem End SyncLock End Function Public Function RemoveFromBack() As Object SyncLock (Me) Dim removeItem As Object = Nothing If IsEmpty() Then Throw New EmptyListException(name) End If removeItem = lastNode.Data If firstNode Is lastNode Then lastNode = Nothing firstNode = lastNode Else Dim current As Node = firstNode While (Not (current.NextNode Is lastNode)) current = current.NextNode End While lastNode = current current.NextNode = Nothing End If Return removeItem End SyncLock End Function Public Function IsEmpty() As Boolean SyncLock (Me) If firstNode Is Nothing Then Return True Else Return False End If End SyncLock End Function Public Overridable Sub Print() SyncLock (Me) If IsEmpty() Then Console.WriteLine("Empty " & name) Return End If Console.Write("The " & name & " is: ") Dim current As Node = firstNode While Not current Is Nothing Console.Write(current.Data & " ") current = current.NextNode End While Console.WriteLine(vbCrLf) End SyncLock End Sub
End Class Public Class Node
Private mData As Object Private mNextNode As Node Public Sub New(ByVal dataValue As Object) MyClass.New(dataValue, Nothing) End Sub Public Sub New(ByVal dataValue As Object, ByVal nextNodeValue As Object) mData = dataValue mNextNode = nextNodeValue End Sub Public ReadOnly Property Data() As Object Get Return mData End Get End Property Public Property NextNode() As Node Get Return mNextNode End Get Set(ByVal value As Node) mNextNode = value End Set End Property
End Class Public Class EmptyListException
Inherits ApplicationException Public Sub New(ByVal name As String) MyBase.New("The " & name & " is empty") End Sub " New
End Class
Public Class Stack
Inherits List Public Sub New() MyBase.New("stack") End Sub " New Public Sub Push(ByVal dataValue As Object) MyBase.InsertAtFront(dataValue) End Sub Public Function Pop() As Object Return MyBase.RemoveFromFront() End Function
End Class Module modStackInheritanceTest
Sub Main() Dim stack As Stack = New Stack() stack.Push(True) " add Boolean stack.Push(Convert.ToChar("$")) " add Char stack.Push(123) stack.Push("aString") " add String stack.Print() Dim removedObject As Object = Nothing Try While True removedObject = stack.Pop() Console.WriteLine(removedObject & " popped") stack.Print() End While Catch emptyListException As EmptyListException Console.Error.WriteLine(emptyListException.StackTrace) End Try End Sub
End Module</source>
The stack is: aString 123 $ True aString popped The stack is: 123 $ True 123 popped The stack is: $ True $ popped The stack is: True True popped Empty stack at List.RemoveFromFront() at modStackInheritanceTest.Main()