学习Excel技术,关注微信公众号:
excelperfect
在上一篇文章《基础扩展 | 13. 使用VBA实现栈结构》中,我们使用很简洁的VBA代码就实现了栈数据结构。我们知道,栈以有序的方式来控制数据的输入和输出,新元素只能加到栈顶,也只能取走栈顶元素,这样实现了后进先出的数据结构。
栈有很多用处,比如你要进行了一系列的操作,然后要以相反的顺序取消这些操作。栈也是实现很多经典算法的数据结构。下面,举两个基础的示例,进一步认识栈。
注意,示例中用到的实现栈结构的基础代码见《基础扩展 | 13. 使用VBA实现栈结构》。
示例1:将十进制数转换成二进制
下面的代码将十进制数转换成相应的二进制数:
代码语言:javascript复制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来测试括号匹配程序。
代码语言:javascript复制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
在代码中,如果是左括号,则入栈。如果是右括号,则与栈顶元素比较。如果相对应,则表明匹配并弹出栈顶元素;如果不对应,则表明括号不匹配。