用于Excel VBA的LIFO(堆栈)算法/类

时间:2011-02-02 06:39:54

标签: excel vba stack

我希望在VBA for Excel中实现“Stack”类。我想使用Last In First Out结构。以前有人遇到过这个问题吗?你知道外部库处理结构,如Stack,Hastable,Vector ......(除了原始的Excel Collection等......)

谢谢

4 个答案:

答案 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类。见:

Hash Table/Associative Array in VBA

答案 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