VB.Net/Data Structure/Stack Yours

Материал из VB Эксперт
Перейти к: навигация, поиск

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>