基础扩展 | 14. 栈结构应用基础示例

2019-07-19 15:51:37 浏览数 (1)

学习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

在代码中,如果是左括号,则入栈。如果是右括号,则与栈顶元素比较。如果相对应,则表明匹配并弹出栈顶元素;如果不对应,则表明括号不匹配。

0 人点赞