|
楼主 |
发表于 2014-12-6 15:05
|
显示全部楼层
2、深度优先集合模拟堆栈的代码注释:- '|==============================================|'
- '| 深度优先集合模拟堆栈 |'
- '|----------------------------------------------|'
- '| 伪代码: |'
- '| 初始化 |'
- '| 根节点及子节点序号0压入堆栈 |'
- '| 循环直到堆栈为空 |'
- '| 调出堆栈顶的节点作为当前节点 |'
- '| 删除堆栈顶数据 |'
- '| 访问当前节点 |'
- '| 如果子节点序号不是其最后一个子节点 |'
- '| 则当前节点及下一个子节点序号压栈 |'
- '| 下一个子节点及其子节点序号0压栈 |'
- '| 经过当前节点到下一个子节点的边 |'
- '| 循环结束退出程序 |'
- '|==============================================|'
- Private Sub 深度优先_集合堆栈_Click()
- Dim cStack As New Collection
- Dim nChildInd%, nInd%, nChild%, aInds
- ' 初始化
- Call Initialize
- With Range(RNG_STAK)
- ' 根节点及子节点序号0压入堆栈
- cStack.Add intRoot & "-" & 0
- .Offset(cStack.Count - 1, 0) = intRoot
- .Offset(cStack.Count - 1, 1) = 0
- Call WaitMoment(0.5)
- ' 循环直到堆栈为空
- Do While cStack.Count > 0
- ' 调出堆栈顶的节点作为当前节点
- aInds = Split(cStack(cStack.Count), "-")
- nInd = aInds(0)
- nChildInd = aInds(1)
- ' 删除堆栈顶数据
- .Offset(cStack.Count - 1, 0).ClearContents
- .Offset(cStack.Count - 1, 1).ClearContents
- cStack.Remove cStack.Count
- ' 访问当前节点
- Call VisitNode(nInd)
- ' 如果子节点序号不是其最后一个子节点
- If nChildInd + 1 <= arrNodes(nInd).ChildrenCount Then
- nChildInd = nChildInd + 1
- nChild = arrNodes(nInd).Children(nChildInd)
- ' 则当前节点及下一个子节点序号压栈
- cStack.Add nInd & "-" & nChildInd
- .Offset(cStack.Count - 1, 0) = nInd
- .Offset(cStack.Count - 1, 1) = nChildInd
- Call WaitMoment(0.5)
- ' 下一个子节点及其子节点序号0压栈
- cStack.Add nChild & "-" & 0
- .Offset(cStack.Count - 1, 0) = nChild
- .Offset(cStack.Count - 1, 1) = 0
- ' 经过当前节点到下一个子节点的边
- Call PassEdge(nInd, nChild)
- End If
- Loop
- End With
- Set cStack = Nothing
- End Sub
复制代码 |
|