Define your own Stack class based on List : Your Stack « Collections « VB.Net Tutorial






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








8.31.Your Stack
8.31.1.Define your own Stack class based on List