Excel VBA的后进先出算法/类

jslywgbw  于 2023-06-30  发布在  其他
关注(0)|答案(5)|浏览(123)

我期待实现一个“堆栈”类在Excel的VBA。我想使用后进先出结构。以前有人遇到过这个问题吗?你知道处理结构的外部库,如Stack,Hastable,Vector...(除了原来的Excel集合等)
谢谢

x759pob2

x759pob21#

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

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

布鲁斯

yk9xbfzb

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中的哈希表/关联数组

hec6srdp

hec6srdp3#

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

1l5u6lss

1l5u6lss4#

您可以在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堆栈非常有用!
类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
pdsfdshx

pdsfdshx5#

https://analystcave.com/vba-stack-using-vba-stack-excel

Dim stack as Object
Set stack = 
CreateObject("System.Collections.Stack")'Create Stack
 
stack.Push "Hello"
stack.Push "There"
stack.Push "Mr"
stack.Push "Smith"
 
peekAtTopOfStack = stack.Peek()
doesContain = stack.Contains("htrh") 'Result: False
doesContain = stack.Contains("Hello") 'Result: True
    
'Get item from the top of the stack (LIFO)
topStack = stack.Pop()  'Result: "Smith"
 
'Clear the Stack
stack.Clear
 
Set stack = Nothing

相关问题