我希望在VBA for Excel中实现“Stack”类。我想使用Last In First Out结构。以前有人遇到过这个问题吗?你知道外部库处理结构,如Stack,Hastable,Vector ......(除了原始的Excel Collection等......)
谢谢
答案 0 :(得分:10)
这是一个非常简单的堆栈类。
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
布鲁斯
答案 1 :(得分:1)
我不知道这些结构的任何外部VBA库。 对于我的过程调用堆栈,我只使用带有Push和Pop方法的全局数组和数组指针。
答案 2 :(得分:1)
Bruce McKinney在本书中提供了Stack,List和Vector的代码(它是VB5(!),但这可能并不重要):
http://www.amazon.com/Hardcore-Visual-Basic-Bruce-McKinney/dp/1572314222
(已经绝版,但使用的副本很便宜。)
源代码似乎在这里可用:
http://vb.mvps.org/hardweb/mckinney2a.htm#2
(警告 - 我从未使用过他的任何代码,但我知道他是一位备受推崇的长期VB专家,他的书已经被MSDN列入了很长时间。)
我确信这些东西在互联网上有很多不同的实现方式,但我不知道是否有任何人被其他人广泛使用,而是他们的作者。
当然,考虑到VBA支持可调整大小的数组(大部分是向量),并且提供了内置的Collection类(大部分是通向a),所以这些东西都不是很难编写自己的代码。列表)。查尔斯威廉的答案是关于你需要的所有信息。只需在数组或集合周围提供自己的包装器,但内部代码可能相对简单。
对于散列表,MS Scripting Runtime包含一个基本上是一个的Dictionary类。见:
答案 3 :(得分:0)
您可以在System.Collections中使用Stack类,因为您可以使用Queue和其他人。只需搜索vb.net堆栈以获取文档。我没有尝试过所有方法(例如Getenumerator - 我不知道如何使用迭代器,如果可能的话,在VBA中)。使用堆栈或队列可以获得一些很好的好处,通常在VBA中不那么容易。你可以使用
anArray = myStack.ToArray
即使堆栈为空(返回大小为0到-1的数组)。
使用自定义集合对象,由于其简单性而非常快速,并且可以轻松地重写(例如,仅处理强类型变量)。您可能想要检查空堆栈。如果您尝试在空堆栈上使用Pop,则VBA将无法正常处理它,因为所有空对象。我觉得使用起来更合理:
If myStack.Count > 0 Then
使用堆栈的函数,而不是将其烘焙到clsStack.Pop中。如果你把它烘焙到课堂上,对Pop的调用可以返回一个选定类型的值 - 当然你可以用它来处理空值,但是你会更加悲伤。
使用示例:
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堆栈非常有用!
Class 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