VB.Net Tutorial/Collections/Your Queue
Версия от 16:40, 26 мая 2010; (обсуждение)
Define your own queue based on the list
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 Queue
Inherits List
Public Sub New()
MyBase.New("queue")
End Sub
Public Sub Enqueue(ByVal dataValue As Object)
MyBase.InsertAtBack(dataValue)
End Sub
Public Function Dequeue() As Object
Return MyBase.RemoveFromFront()
End Function
End Class
Module modQueueTest
Sub Main()
Dim queue As Queue = New Queue()
queue.Enqueue(Convert.ToChar("$"))
queue.Enqueue(123)
queue.Enqueue("hello")
queue.Enqueue(True)
queue.Print()
Dim removedObject As Object = Nothing
Try
While True
removedObject = queue.Dequeue()
Console.WriteLine(removedObject & " dequeue")
queue.Print()
End While
Catch emptyListException As EmptyListException
Console.Error.WriteLine(emptyListException.StackTrace)
End Try
End Sub
End Module
The queue is: $ 123 hello True $ dequeue The queue is: 123 hello True 123 dequeue The queue is: hello True hello dequeue The queue is: True True dequeue Empty queue at List.RemoveFromFront() at modQueueTest.Main()