LIFO(堆栈)algorithm/ Excel VBA类

我正在寻找在VBA for Excel中实现“Stack”类。 我想要使​​用“后进先出”结构。 有没有人遇到过这个问题? 你知道外部库处理结构,如Stack,Hastable,Vector …(除了原来的Excel集合等…)

谢谢

这是一个非常简单的堆栈类。

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 

testing它

 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 

布鲁斯

我不知道这些结构的任何外部VBA库。 对于我的过程调用堆栈,我只是使用全局数组和数组指针,使用Push和Pop方法。

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支持可resize的数组(大部分是向量的方式),并提供了一个内置的Collection类(大部分是列表的方式)。 查尔斯·威廉的答案是关于你需要的所有信息。 只要提供你自己的包装,可以是一个数组或集合,但是里面的代码可以相对简单。

对于散列表,MS脚本运行时包含基本上是一个的Dictionary类。 看到:

VBA中的哈希表/关联数组

您可以在System.Collections中使用类Stack,因为您可以使用Queue和其他类。 只要searchvb.net堆栈文件。 我没有尝试过所有的方法(例如Getenumerator – 我不知道如何使用迭代器,如果可能的话在VBA中)。 使用堆栈或队列给你一些好处,在VBA中通常不那么容易。 您可以使用

 anArray = myStack.ToArray 

即使堆栈是空的(返回一个大小为0到-1的数组)。

使用一个自定义的集合对象,由于其简单性,它可​​以非常快速地工作,并且可以很容易地被重写(例如只处理强types的variables)。 您可能需要检查空的堆栈。 如果你尝试在一个空栈上使用Pop,那么VBA将不会像所有的空对象那样正常地处理它。 我发现使用更合理:

 If myStack.Count > 0 Then 

从使用堆栈的函数,而不是烘烤到clsStack.Pop。 如果你把它烧进class级,对Pop的调用可以返回一个选定types的值 – 当然你可以用它来处理空值,但是你会更加悲伤。

使用示例:

 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 
Interesting Posts