VB堆栈的实现


VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =   3195
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   4680
   LinkTopic       =   "Form1"
   ScaleHeight     =   3195
   ScaleWidth      =   4680
   StartUpPosition =   3  '窗口缺省
   Begin VB.CommandButton Command1 
      Caption         =   "Command1"
      Height          =   495
      Left            =   1800
      TabIndex        =   0
      Top             =   1320
      Width           =   1215
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private Sub Command1_Click()
'
    Dim cStack As clsstack
    Dim i As Long
    
    Set cStack = New clsstack
'    ---------------------------------------------------------------------------------------------------
    Debug.Print "String Data: "
    For i = 65 To 90
        cStack.Push Chr(i)
    Next i
    
    Debug.Print "Peek:"; cStack.Peek
    Debug.Print "Stack Data Count"; cStack.StackDataCount
    For i = 1 To cStack.StackDataCount
        Debug.Print cStack.Pop
    Next i
    Debug.Print
    
'    ---------------------------------------------------------------------------------------------------
    Debug.Print "Long Data: "
    cStack.Clear
    For i = 1 To 20
        cStack.PushLong i
    Next i
    Debug.Print "Peek:"; cStack.PeekLong
    Debug.Print "Stack Data Count:"; cStack.StackDataCount
    For i = 1 To cStack.StackDataCount
        Debug.Print cStack.PopLong
    Next i
    Debug.Print
    
'    ---------------------------------------------------------------------------------------------------
    
    Debug.Print "Single Data: "
    cStack.Clear
    For i = 1 To 20
        cStack.PushSng i / 2
    Next i
    Debug.Print "Peek:"; cStack.PeekSng
    Debug.Print "Stack Data Count:"; cStack.StackDataCount
    For i = 1 To cStack.StackDataCount
        Debug.Print cStack.PopSng
    Next i
    Debug.Print
    
'    ---------------------------------------------------------------------------------------------------

    Debug.Print "Double Data: "
    cStack.Clear
    For i = 1 To 20
        cStack.PushDbl i / 3
    Next i
    Debug.Print "Peek:"; cStack.PeekDbl
    Debug.Print "Stack Data Count:"; cStack.StackDataCount
    For i = 1 To cStack.StackDataCount
        Debug.Print cStack.PopDbl
    Next i
    Debug.Print

End Sub




VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "clsstack"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

Private Enum STK_DataType
    stkUnDefined = 0
    stkString = 1
    stkLong = 2
    stkSingle = 3
    stkDouble = 4
End Enum

Private lStackData() As String
Private lStackDataLong() As Long
Private lStackDataSingle() As Single
Private lStackDataDouble() As Double
Private lStackDataCount As Long
Private mStackDataUbound As Long
Private mDataType As STK_DataType

Private Const mcArrExpandPer As Long = 100

Public Function Pop() As String
'
    If lStackDataCount < 1 Or mDataType <> stkString Then Exit Function
    
    Pop = lStackData(lStackDataCount)
    lStackDataCount = lStackDataCount - 1
    
End Function

Public Function PopLong() As Long
'
    If lStackDataCount < 1 Or mDataType <> stkLong Then Exit Function
    
    PopLong = lStackDataLong(lStackDataCount)
    lStackDataCount = lStackDataCount - 1
    
End Function

Public Function PopSng() As Single
'
    If lStackDataCount < 1 Or mDataType <> stkSingle Then Exit Function
    
    PopSng = lStackDataSingle(lStackDataCount)
    lStackDataCount = lStackDataCount - 1
    
End Function

Public Function PopDbl() As Double
'
    If lStackDataCount < 1 Or mDataType <> stkDouble Then Exit Function
    
    PopDbl = lStackDataDouble(lStackDataCount)
    lStackDataCount = lStackDataCount - 1
    
End Function


Public Function Push(DataToPush As String) As Long
'
    If mDataType = stkUnDefined Then mDataType = stkString
    If mDataType <> stkString Then Exit Function
    
    ExpandArr
    lStackDataCount = lStackDataCount + 1
    lStackData(lStackDataCount) = DataToPush
    Push = lStackDataCount
End Function

Public Function PushLong(DataToPush As Long) As Long
'
    If mDataType = stkUnDefined Then mDataType = stkLong
    If mDataType <> stkLong Then Exit Function
    
    ExpandArr
    lStackDataCount = lStackDataCount + 1
    lStackDataLong(lStackDataCount) = DataToPush
    PushLong = lStackDataCount
    
End Function

Public Function PushSng(DataToPush As Single) As Long
'
    If mDataType = stkUnDefined Then mDataType = stkSingle
    If mDataType <> stkSingle Then Exit Function
    
    ExpandArr
    lStackDataCount = lStackDataCount + 1
    lStackDataSingle(lStackDataCount) = DataToPush
    PushSng = lStackDataCount
    
End Function

Public Function PushDbl(DataToPush As Double) As Long
'
    If mDataType = stkUnDefined Then mDataType = stkDouble
    If mDataType <> stkDouble Then Exit Function
    
    ExpandArr
    lStackDataCount = lStackDataCount + 1
    lStackDataDouble(lStackDataCount) = DataToPush
    PushDbl = lStackDataCount
End Function

Public Function Peek() As String
'
    If lStackDataCount < 1 Or mDataType <> stkString Then Exit Function
    Peek = lStackData(lStackDataCount)
    
End Function

Public Function PeekLong() As Long
'
    If lStackDataCount < 1 Or mDataType <> stkLong Then Exit Function
    PeekLong = lStackDataLong(lStackDataCount)
    
End Function

Public Function PeekSng() As Single
'
    If lStackDataCount < 1 Or mDataType <> stkSingle Then Exit Function
    PeekSng = lStackDataSingle(lStackDataCount)
    
End Function

Public Function PeekDbl() As Double
'
    If lStackDataCount < 1 Or mDataType <> stkDouble Then Exit Function
    PeekDbl = lStackDataDouble(lStackDataCount)
    
End Function

Public Function IsEmpty() As Boolean
'
    IsEmpty = (lStackDataCount < 1)
End Function

Public Sub Clear()
'
    Erase lStackData()
    Erase lStackDataLong()
    Erase lStackDataSingle()
    Erase lStackDataDouble()
    
    lStackDataCount = 0
    mStackDataUbound = 0
    mDataType = stkUnDefined
    
End Sub

Private Sub ExpandArr()
'
    If lStackDataCount + 1 > mStackDataUbound Then
        mStackDataUbound = mStackDataUbound + mcArrExpandPer
        Select Case mDataType
            Case stkString
                ReDim Preserve lStackData(1 To mStackDataUbound)
                
            Case stkLong
                ReDim Preserve lStackDataLong(1 To mStackDataUbound)
                
            Case stkSingle
                ReDim Preserve lStackDataSingle(1 To mStackDataUbound)
                
            Case stkDouble
                ReDim Preserve lStackDataDouble(1 To mStackDataUbound)
                
        End Select
    End If
End Sub

Public Property Get StackDataCount() As Long
'
    StackDataCount = lStackDataCount
    
End Property

Private Sub Class_Initialize()
'
    lStackDataCount = 0
    mStackDataUbound = 0
    mDataType = stkUnDefined
    
End Sub

Private Sub Class_Terminate()
'
    Clear
    
End Sub

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...