VB.Net/Data Structure/Stack Yours
Our Stack based on our List
<source lang="vbnet"> Imports System Public Class MainClass
Public Shared Sub Main() Dim stack As Stack = New Stack() Dim aBoolean As Boolean = True Dim aCharacter As Char = Convert.ToChar("$") Dim anInteger As Integer = 34 Dim aString As String = "www.vbex.ru" stack.Push(aBoolean) Console.WriteLine(stack) stack.Push(aCharacter) Console.WriteLine(stack) stack.Push(anInteger) Console.WriteLine(stack) stack.Push(aString) Console.WriteLine(stack) Dim removedObject As Object = Nothing Try While True removedObject = stack.Pop() Console.WriteLine(removedObject & " popped") Console.WriteLine(stack) End While Catch emptyListException As EmptyListException Console.Error.WriteLine(emptyListException.StackTrace) End Try End Sub
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 " Push Public Function Pop() As Object Return MyBase.RemoveFromFront() End Function
End Class
Public Class List
Private firstNode As ListNode Private lastNode As ListNode 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 Public Sub InsertAtFront(ByVal insertItem As Object) SyncLock (Me) If IsEmpty() Then lastNode = New ListNode(insertItem) firstNode = lastNode Else firstNode = New ListNode(insertItem, firstNode) End If End SyncLock End Sub Public Sub InsertAtBack(ByVal insertItem As Object) SyncLock (Me) If IsEmpty() Then lastNode = New ListNode(insertItem) firstNode = lastNode Else lastNode.NextNode = New ListNode(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 ListNode = 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 Overrides Function ToString() As String Dim str As String = New String("") SyncLock (Me) If IsEmpty() Then Return "Empty " & name End If str = "The " & name & " is: " Dim current As ListNode = firstNode While Not current Is Nothing str += current.Data & " " current = current.NextNode End While Return str End SyncLock End Function
End Class
Public Class ListNode
Private mData As Object Private mNextNode As ListNode 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 ListNode Get Return mNextNode End Get Set(ByVal value As ListNode) 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
End Class
</source>