隊列的工作原理很簡單,因為它與現(xiàn)實生活中的隊列完全相同。例如,你在食堂窗口排隊打飯,如果你先到,當然該你先打飯,我排在你的后面,則在你打完飯后我再打飯。
隊列只有兩種操作:入隊和出隊。將一個元素加入隊列,稱為入隊;從隊列中取出一個元素,稱為出隊,如下圖1所示。
圖1
根據(jù)隊列的工作原理,在圖1所示的隊列中,丁只能加到隊列的末尾,而排在最前的甲將最先出隊。
下面,我們使用VBA代碼實現(xiàn)隊列。
實現(xiàn)隊列結構需要兩個類模塊:QueueItem類模塊和Queue類模塊。
QueueItem類模塊
在QueueItem類模塊中,存放著一個數(shù)據(jù)值和一個指向下一個元素的指針。代碼如下:
‘下一個隊列元素
Public NextItem As QueueItem
‘隊列中當前元素的值
Public Value As Variant
Queue類模塊
在Queue類模塊中,包含兩個方法和一個屬性。其中,Add方法在隊列中添加元素,即執(zhí)行入隊操作;Remove方法移除隊列中的元素,即執(zhí)行出隊操作;QueueEmpty屬性判斷隊列是否為空。完整的代碼如下:
‘指向隊列列首的指針
Dim qFront As QueueItem
‘指向隊列列尾的指針
Dim qRear As QueueItem
‘入隊
Public Sub Add(varNewItem AsVariant)
‘聲明并創(chuàng)建新元素
Dim qNew As New QueueItem
‘將值賦給新元素
qNew.Value = varNewItem
‘如果隊列為空,則前后指針都指向新元素
If QueueEmpty Then
Set qFront = qNew
Set qRear = qNew
Else
‘將最后的元素指針指向新元素
Set qRear.NextItem = qNew
‘將指向隊列列尾的指向新元素
Set qRear = qNew
End If
End Sub
‘出隊
‘移除隊列列首的元素并返回其值
Public Function Remove() AsVariant
‘如果隊列為空,則返回空
If QueueEmpty Then
Remove = Null
Else
‘獲取隊列列首元素值
Remove = qFront.Value
‘如果隊列中僅一個元素
‘則移除后隊列為空
If qFront Is qRear Then
Set qFront = Nothing
Set qRear = Nothing
Else
Set qFront = qFront.NextItem
End If
EndIf
End Function
‘判斷隊列是否為空
Property Get QueueEmpty() AsBoolean
‘如果隊列為空則返回True
QueueEmpty = ((qFront Is Nothing) And(qRear Is Nothing))
End Property
假設原有隊列“甲乙丙”,現(xiàn)在要將“丁”加入該隊列。在Add方法中,首先生成新節(jié)點并賦值,如下圖2所示。
圖6