前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基础扩展 | 13. 使用VBA实现栈结构

基础扩展 | 13. 使用VBA实现栈结构

作者头像
fanjy
发布2019-07-19 15:42:42
1.2K0
发布2019-07-19 15:42:42
举报
文章被收录于专栏:完美Excel完美Excel

学习Excel技术,关注微信公众号:

excelperfect

栈是一种常见的基础数据结构,用来实现后进先出的目的。比如,在桌子上摞了一堆书,最后放的书一定在最上面,最先拿走的也是最上面的书。

栈中的元素只能从栈顶进入,称为入栈,如下图1所示。栈中的元素只能从栈顶删除,称为出栈,如下图2所示。

图1

图2

在一些高级编程语言,例如C中,利用指针可以很容易实现栈结构。其实,在VBA中也很容易实现栈。

如下图3所示,变量siTop指向栈顶,从栈顶开始,每个元素项都指向其下一元素项,直至栈底。

图3

这里,使用了两个类模块:StackItem类模块、Stack类模块。

StackItem类模块

在StackItem类模块中,仅包含两个变量,变量Value用来包含每的元素的值,变量NextItem用来指向其下一元素项。StackItem类模块中的代码为:

'元素值

Public Value As Variant

'下一元素

Public NextItem As StackItem

注意到,在StackItem类模块中,变量NextItem声明为该类自身,正是因为这种自引用声明使VBA中可以生成动态的数据结构。

Stack类模块

在Stack类模块中,声明了一个指向栈顶的变量siTop,实现了入栈操作的Push方法、出栈操作的Pop方法、以及两个只读属性StackTop和StackEmpty,其中StackTop属性用来返回栈顶元素的值,StackEmpty属性返回栈是否为空,True表示栈中没有元素项,False表示栈中有元素项。

Stack类模块的代码:

代码语言:javascript
复制
'栈顶
Dim siTop As StackItem
'在栈顶添加新元素
Public Sub Push(ByVal varTextAs Variant)
    Dim siNewTop As New StackItem
    siNewTop.Value = varText
    Set siNewTop.NextItem = siTop
    Set siTop = siNewTop
End Sub
Public Function Pop() AsVariant
    If Not StackEmpty Then
        '从栈顶获取元素值
        Pop = siTop.Value
        '接着,设置新栈顶
        Set siTop = siTop.NextItem
    EndIf
End Function
'栈是否为空
Property Get StackEmpty() AsBoolean
    StackEmpty = (siTop Is Nothing)
End Property
'栈顶元素值
Property Get StackTop() AsVariant
    If StackEmpty Then
        StackTop = Null
    Else
        StackTop = siTop.Value
    End If
End Property

测试栈

下面的代码用来测试已实现的栈数据结果。在VBE中插入一个标准模块,在其中输入下面的代码:

代码语言:javascript
复制
Dim stkTest As New Stack
Sub TestStacks()
    '入栈
    stkTest.Push "Excel"
    stkTest.Push "excelperfect"
    stkTest.Push "完美Excel"
    '出栈并打印元素值
    Do While Not stkTest.StackEmpty
        Debug.Print stkTest.Pop()
    Loop
    Debug.Print "--------------"
    '入栈
    stkTest.Push "测试"
    Debug.Print stkTest.StackTop
End Sub

运行代码的结果如下图4所示。

图4

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档