亞寵展、全球?qū)櫸锂a(chǎn)業(yè)風(fēng)向標(biāo)——亞洲寵物展覽會(huì)深度解析
549
2025-04-02
excel隊(duì)列
隊(duì)列的工作原理很簡單,因?yàn)樗c現(xiàn)實(shí)生活中的隊(duì)列完全相同。例如,你在食堂窗口排隊(duì)打飯,如果你先到,當(dāng)然該你先打飯,我排在你的后面,則在你打完飯后我再打飯。
隊(duì)列只有兩種操作:入隊(duì)和出隊(duì)。將一個(gè)元素加入隊(duì)列,稱為入隊(duì);從隊(duì)列中取出一個(gè)元素,稱為出隊(duì),如下圖1所示。
圖1
根據(jù)隊(duì)列的工作原理,在圖1所示的隊(duì)列中,丁只能加到隊(duì)列的末尾,而排在最前的甲將最先出隊(duì)。
下面,我們使用VBA代碼實(shí)現(xiàn)隊(duì)列。
實(shí)現(xiàn)隊(duì)列結(jié)構(gòu)需要兩個(gè)類模塊:QueueItem類模塊和Queue類模塊。
QueueItem類模塊
在QueueItem類模塊中,存放著一個(gè)數(shù)據(jù)值和一個(gè)指向下一個(gè)元素的指針。代碼如下:
‘下一個(gè)隊(duì)列元素
Public NextItem As QueueItem
‘隊(duì)列中當(dāng)前元素的值
Public Value As Variant
Queue類模塊
在Queue類模塊中,包含兩個(gè)方法和一個(gè)屬性。其中,Add方法在隊(duì)列中添加元素,即執(zhí)行入隊(duì)操作;Remove方法移除隊(duì)列中的元素,即執(zhí)行出隊(duì)操作;QueueEmpty屬性判斷隊(duì)列是否為空。完整的代碼如下:
‘指向隊(duì)列列首的指針
Dim qFront As QueueItem
‘指向隊(duì)列列尾的指針
Dim qRear As QueueItem
‘入隊(duì)
Public Sub Add(varNewItem AsVariant)
Dim qNew As New QueueItem
‘將值賦給新元素
qNew.Value = varNewItem
‘如果隊(duì)列為空,則前后指針都指向新元素
If QueueEmpty Then
Set qFront = qNew
Set qRear = qNew
Else
‘將最后的元素指針指向新元素
Set qRear.NextItem = qNew
‘將指向隊(duì)列列尾的指向新元素
Set qRear = qNew
End If
End Sub
‘出隊(duì)
‘移除隊(duì)列列首的元素并返回其值
Public Function Remove() AsVariant
‘如果隊(duì)列為空,則返回空
If QueueEmpty Then
Remove = Null
Else
‘獲取隊(duì)列列首元素值
Remove = qFront.Value
‘如果隊(duì)列中僅一個(gè)元素
‘則移除后隊(duì)列為空
If qFront Is qRear Then
Set qFront = Nothing
Set qRear = Nothing
Else
Set qFront = qFront.NextItem
End If
EndIf
End Function
‘判斷隊(duì)列是否為空
Property Get QueueEmpty() AsBoolean
‘如果隊(duì)列為空則返回True
QueueEmpty = ((qFront Is Nothing) And(qRear Is Nothing))
End Property
假設(shè)原有隊(duì)列“甲乙丙”,現(xiàn)在要將“丁”加入該隊(duì)列。在Add方法中,首先生成新節(jié)點(diǎn)并賦值,如下圖2所示。
圖2
然后,進(jìn)行連接,如下圖3所示。
圖3
如果添加新元素前為空隊(duì)列,則將隊(duì)首和隊(duì)尾均指向新元素,如下圖4所示。
圖4
在移除元素時(shí),從隊(duì)首開始,如下圖5所示。原先qFront指向甲,現(xiàn)在將其指向乙。
圖5
Queue類模塊代碼的圖片版如下:
示例
下面的示例簡單演示了隊(duì)列。代碼首先生成一個(gè)隊(duì)列并將“甲已丙丁”依次添加到該隊(duì)列,然后移除隊(duì)列中的元素。
‘創(chuàng)建新隊(duì)列
Dim qTest As New Queue
Sub testQueue()
With qTest
‘入隊(duì)
.Add “甲”
.Add “乙”
.Add “丙”
.Add “丁”
Debug.Print “出隊(duì)順序:”
‘出隊(duì)
Do While Not .QueueEmpty
Debug.Print .Remove()
Loop
End With
End Sub
運(yùn)行后的結(jié)果如下圖6所示。可以看到,出隊(duì)的順序與入隊(duì)的順序相同。
圖6
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。