棧有很多用處,比如你要進行了一系列的操作,然后要以相反的順序取消這些操作。棧也是實現很多經典算法的數據結構。下面,舉兩個基礎的示例,進一步認識棧。
示例1:將十進制數轉換成二進制
下面的代碼將十進制數轉換成相應的二進制數:
Dim stkTest As New Stack
‘數制轉換代碼
Sub convert()
‘要轉換成的進制數
Dim n As Integer
‘要轉換的十進制數
Dim numValue As Long
‘存放轉換中的數
Dim num As Long
‘存放轉換后的數
Dim str
‘將n修改為想要轉換成的進制
‘將numValue修改為想要轉換的數
n = 2
numValue = 1348
num = numValue
‘將轉換后的數壓入棧
Do Until (num = 0)
stkTest.Push (num – (num \ n) * n)
num = num \ n
Loop
‘逐個數出棧,組合成轉換后的結果
Do While (Not stkTest.StackEmpty)
str = str & stkTest.Pop
Loop
MsgBox numValue & “轉換為” & n & “進制之后的數為:” & str
End Sub
代碼運行后的結果如下圖1所示。
圖1
可以將代碼中的變量n修改為想要轉換的進制,例如n=2,表示將數轉換成二進制。如果n=8,那么將數轉換成八進制。代碼中的變量numValue是要轉換的十進制數,你可以修改為任意的十進制數。
示例2:判斷括號是否匹配
有時候,我們需要判斷表達式中的括號是否匹配,例如,由于輸入疏忽,漏掉了相應的右括號。可以使用下面的程序來判斷括號是否匹配。為了演示方便,直接使用一個包括符號和數字的數組var來測試括號匹配程序。
Dim testStack As New Stack
Sub MatchBracket()
Dim var As Variant
Dim bln As Boolean
bln = True
var = Array(“{“, “[“,”9”, “(“, “)”, “+”, “]”,”}”)
Dim i As Long
For i = LBound(var) To UBound(var)
Select Case var(i)
Case “{“, “[“,”(”
testStack.Push var(i)
Case “)”
If testStack.StackTop =”(” Then
testStack.Pop
Else
bln = False
End If
Case “]”
If testStack.StackTop =”[” Then
testStack.Pop
Else
bln = False
End If
Case “}”
If testStack.StackTop =”{” Then
testStack.Pop
Else
bln = False
End If
End Select
Next i
If bln Then
MsgBox “表達式中的括號是匹配的”
Else
MsgBox “表達式中的括號不匹配”
End If
End Sub
在代碼中,如果是左括號,則入棧。如果是右括號,則與棧頂元素比較。如果相對應,則表明匹配并彈出棧頂元素;如果不對應,則表明括號不匹配。