Option Explicit
Dim pStack As Collection
Public Function Pop() As Variant
With pStack
If .Count > 0 Then
Pop = .Item(.Count)
.Remove .Count
End If
End With
End Function
Public Function Push(newItem As Variant) As Variant
With pStack
.Add newItem
Push = .Item(.Count)
End With
End Function
Public Sub init()
Set pStack = New Collection
End Sub
测试一下
Option Explicit
Sub test()
Dim cs As New cStack
Dim i As Long
Set cs = New cStack
With cs
.init
For i = 1 To 10
Debug.Print CStr(.Push(i))
Next i
For i = 1 To 10
Debug.Print CStr(.Pop)
Next i
End With
End Sub
Private Sub TestStack()
Dim i as long
Dim myStack as clsStack
Set myStack = New clsStack
For i = 1 to 2
myStack.Push i
Next
For i = 1 to 3
If myStack.Count > 0 Then
Debug.Print myStack.Pop
Else
Debug.Print "Stack is empty"
End If
Next
Set myStack = Nothing
End Sub
使用LIFO堆栈非常有用! 类clsStack
Dim pStack as Object
Private Sub Class_Initialize()
set pStack = CreateObject("System.Collections.Stack")
End Sub
Public Function Push(Value as Variant)
pStack.Push Value
End Function
Public Function Pop() As Variant
Pop = pStack.Pop
End Function
Public Function Count() as long
Count = pstack.Count
End Function
Public Function ToArray() As Variant()
ToArray = pStack.ToArray()
End Function
Public Function GetHashCode() As Integer
GetHashCode = pStack.GetHashCode
End Function
Public Function Clear()
pStack.Clear
End Function
Private Sub Class_terminate()
If (Not pStack Is Nothing) Then
pStack.Clear
End If
Set pStack = Nothing
End Sub
5条答案
按热度按时间x759pob21#
这是一个非常简单的堆栈类。
测试一下
布鲁斯
yk9xbfzb2#
布鲁斯McKinney在这本书中提供了堆栈、列表和向量的代码(它是VB 5(!),但这可能并不重要):
http://www.amazon.com/Hardcore-Visual-Basic-Bruce-McKinney/dp/1572314222
(It《》已经绝版了,但二手的很便宜。)
源代码可以在这里找到:
http://vb.mvps.org/hardweb/mckinney2a.htm#2
(注意-我从未使用过他的任何代码,但我知道他是一位备受尊敬的长期VBMaven,他的书在MSDN上收录了很长一段时间。
我相信在互联网上也有很多不同的实现,但我不知道除了它们的作者之外,是否有人广泛使用它们。
当然,这些东西都不难编写自己的代码,因为VBA支持可调整大小的数组(大部分是向量),并提供了一个内置的Collection类(大部分是列表)。查尔斯·威廉对一堆的回答是关于你需要的所有信息。只需提供自己的数组或Collection Package 器,但其中的代码可能相对简单。
对于哈希表,MS脚本运行时包括一个字典类,基本上是一个。参见:
VBA中的哈希表/关联数组
hec6srdp3#
我不知道这些结构的任何外部VBA库。对于我的过程调用堆栈,我只是使用一个全局数组和数组指针以及Push和Pop方法。
1l5u6lss4#
您可以在System.Collections中使用Stack类,就像您可以使用Queue和其他类一样。只需搜索vb.net堆栈以获取文档。我没有尝试过所有的方法(例如:Getenumerator -我不知道如何使用迭代器,如果在VBA中可能的话。使用堆栈或队列会给您带来一些好处,这在VBA中通常不那么容易。你可以用
即使堆栈为空(返回大小为0到-1的数组)。
使用自定义的集合对象,由于其简单性,它的工作速度非常快,并且可以很容易地重写(例如仅处理强类型变量)。您可能需要检查空堆栈。如果您尝试在空堆栈上使用Pop,VBA将不会像处理所有空对象那样正常处理它。我觉得用这个更合理:
使用堆栈从函数中获取,而不是将其烘焙到clsStack. pop中。如果将其烘焙到类中,则对Pop的调用可以返回所选类型的值-当然,您可以使用它来处理空值,但这样会带来更多麻烦。
使用示例:
使用LIFO堆栈非常有用!
类clsStack
pdsfdshx5#
https://analystcave.com/vba-stack-using-vba-stack-excel