VB.Net Tutorial/Collections/Your Stack

Материал из VB Эксперт
Версия от 15:53, 26 мая 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

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()