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