使用VBA实现栈结构
发布时间:2023-11-16 06:47:12
栈是一种常见的基础数据结构,用来实现后进先出的目的。比如,在桌子上摞了一堆书,最后放的书一定在最上面,最先拿走的也是最上面的书。
栈中的元素只能从栈顶进入,称为入栈,如下图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类模块的代码:
‘栈顶
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
广告动手学深度学习 全彩精装版
作者:阿斯顿·张(Aston Zhang) 李沐(Mu Li)[美] 扎卡里·C. 立
当当
测试栈
下面的代码用来测试已实现的栈数据结果。在VBE中插入一个标准模块,在其中输入下面的代码:
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所示。


猜你喜欢
- Win10笔记本弹出settings:display错误怎么解决?弹出settings:display错误的问题很多都出现在安装了win10
- 我们在使用电脑的过程中,如果不方便使用键盘进行输入的话该怎么办呢,我们可以使用系统自带的虚拟键盘进行操作,那在Win10系统内要怎么快速开启
- 为什么每次打开PPT字体颜色都是红色,而不是刚刚使用过的颜色?字体颜色都是红色,这种情况应该是您设置了字体颜色是红色,可检查下。刚刚使用的颜
- 本地hosts文件位置在哪呢?小编为大家整理了本地hosts文件的所在位置,帮助大家快速找到本地hosts文件。下面跟我一起来看看吧。本地h
- Win10系统运行时间错误怎么办?最近有用户在打开浏览器上网的时候,一直出现运行时间错误的提示,该如何解决这个问题?请看下文具体介绍。操作方
- 许多用户在使用电脑的时候经常会使用到本地策略组,而在电脑中最快的打开方法就是打开运行窗口输入gpedit.msc就可以实现,但是最近不少用户
- 正确设置新的Apple TV 4K不仅需要将其连接到电视机并打开它,甚至还需要遵循Apple自己的设置步骤,否则您将需要进行更多的设置。需插
- 坐办公室的朋友们经常会做一些报表,例如什么酒水报表、工资表、值班表,做的时候遇到特殊的情况,需要在表中备注一些信息,这个时候就用到插入批注了
- 下面讲解一下Win8应用的相关操作:安装、卸载和管理;通过Windows Store应用商店,我们就可以搜索和安装自己喜欢的应用程序,以磁贴
- 在word中,很多时候会因为需要要给背景添加一个背景,那么怎么给word添加背景呢?今天,小编就教大家在Wps中给背景添加图片的操作方法。W
- 我们在制作wps演示的时候,经常会为某些图片添加超链接来实现点击跳转的效果,下面就让小编告诉你wps演示怎样为图片添加超链接吧,不懂的朋友会
- WPS表格中的数据怎么标记符合要求的数字?WPS表格中有很多数据,想要显示符合要求的数据,该怎么设置呢?下面我们就来看看详细的教程,需要的朋
- cad线条加粗的方法:1、如图所示,我用L命令绘制一根线段:,这根线段的宽度为默认宽度0.01mm。我现在的目的是使这根的线段变宽。2、方法
- 距离上次发布隔了 2 周后的今天,苹果今向 iPhone 和 iPad 用户推送了 iOS 15/i
- word水印现在都是常见的了,那么怎么删除水印呢?今天就给大家分享在word删除水印的方法,希望这个小技能对您有帮助!1、删除水印如果是文档
- IMSQRT函数是计算复数平方根的函数,那如何在EXCEL表格中使用该函数呢?下面就跟小编一起来看看吧。excel使用IMSQRT函数的步骤
- 对于手机截图,大家应该都不陌生,但是在电脑上截图的时候往往不知道如何操作,特别是需要截长图的情况下,除了使用软件进行拼接外,还有什么长屏截图
- 财经应用这一工具值得商务人士和金融人士关注。今天小编来介绍一下财经应用,在Win8上运用货币价值计算工具,感兴趣的朋友可以看看微软在Win8
- 一般笔记本用都拥有充电阈值能够通过不充满电来保护电池健康,但是一些升级到Win11系统的小伙伴不清楚充电限制要如何设置,那么遇到这种情况要怎
- 对微软的最新操作系统Windows 7来说,它现在是否已经能够完美的支持即将取代IPv4的IPV6地址呢