如何写一个循环队列啊
我想写一个循环队列,可以队尾输入数据,从队首删除数据。
'把下以内容保存成cCyclicBuffer VERSION 1.0 CLASS BEGIN MultiUse = -1 'True Persistable = 0 'NotPersistable DataBindingBehavior = 0 'vbNone DataSourceBehavior = 0 'vbNone MTSTransactionMode = 0 'NotAnMTSObject END Attribute VB_Name = "cCyclicBuffer" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Attribute VB_Exposed = False Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes" Attribute VB_Ext_KEY = "Top_Level" ,"Yes" '******************************************************************** '* '* Class: cCyclicBuffer.cls '* '* Copyright (c) Com-mania II 2000 '* '* Purpose: Cyclic buffer (queue) implementation with events '* '* Overview: This is an object-oriented implementation of queue '* '* Revision History: '* V.1.0.0 March 2000 Azlan Muhamad Sufian '* Initial version '* '******************************************************************** 'References: 'Components: Option Explicit 'All variables must be declared Option Base 1 'Arrays begin with 1 'To fire this event, use RaiseEvent with the following syntax: 'RaiseEvent BufFull[(arg1, arg2, ... , argn)] Public Event BufFull() 'Buffer is full 'To fire this event, use RaiseEvent with the following syntax: 'RaiseEvent BufEmpty[(arg1, arg2, ... , argn)] Public Event BufEmpty() 'Buffer is empty 'To fire this event, use RaiseEvent with the following syntax: 'RaiseEvent OnBuf[(arg1, arg2, ... , argn)] Public Event OnBuf() 'Fired when iSze >= iThreshold 'local variable(s) to hold property value(s) Private vItm() As Variant 'Buffer elements Private iMaxSze As Integer 'Maximum buffer size Private iSze As Integer 'Current buffer size Private iHd As Integer 'Pointer to last element or next empty space Private iTl As Integer 'Pointer to next element to read from Private mvariThreshold As Integer 'Threshold for firing OnBuf Private mvarbOverwriteOnFull As Boolean 'Flag whether to overwrite full buffer Public Property Let iThreshold(ByVal vData As Integer) 'used when assigning a value to the property, on the left side of an assignment. 'Syntax: X.iThreshold = 5 mvariThreshold = vData End Property Public Property Get iThreshold() As Integer 'used when retrieving value of a property, on the right side of an assignment. 'Syntax: Debug.Print X.iThreshold iThreshold = mvariThreshold End Property Public Property Let bOverwriteOnFull(ByVal vData As Boolean) 'used when assigning a value to the property, on the left side of an assignment. 'Syntax: X.bflushonscheme = 5 mvarbOverwriteOnFull = vData End Property Public Property Get bOverwriteOnFull() As Boolean 'used when retrieving value of a property, on the right side of an assignment. 'Syntax: Debug.Print X.bflushonscheme bOverwriteOnFull = mvarbOverwriteOnFull End Property Public Sub GetAllItems(vItems() As Variant) 'Copy all items into vItems array but do not alter head/tail Dim iIndex As Integer Dim iTmpHd As Integer Dim iTmpTl As Integer ReDim vItems(iMaxSze) As Variant iTmpHd = iHd iTmpTl = iTl iIndex = 1 If Not IsEmpty Then While iIndex <= iSze vItems(iIndex) = vItm(iTmpTl) iIndex = iIndex + 1 iTmpTl = (iTmpTl Mod iMaxSze) + 1 Wend End If End Sub Public Sub GetInternalProperties(Optional iMaxSize As Integer, Optional iCurrentSize As Integer, _ Optional iHead As Integer, Optional iTail As Integer) 'Get internal properties iMaxSize = iMaxSze iCurrentSize = iSze iHead = iHd iTail = iTl End Sub Public Sub Copy(ByVal cSrcCycBuf As cCyclicBuffer) 'Copy constructor Dim iIndex As Integer Dim vAllItems() As Variant Dim iSrcMxSz As Integer cSrcCycBuf.GetInternalProperties iSrcMxSz Create iSrcMxSz mvariThreshold = cSrcCycBuf.iThreshold mvarbOverwriteOnFull = cSrcCycBuf.bOverwriteOnFull cSrcCycBuf.GetAllItems vAllItems CopyItems vAllItems End Sub Private Sub CopyItems(vItems() As Variant) 'Push elements from a source array 'The iHd, iTl & iSze will be automatically updated Dim iCount As Integer Dim vItem As Variant For iCount = LBound(vItems) To UBound(vItems) vItem = vItems(iCount) If vItem <> Empty Then PutItem vItems(iCount) End If Next iCount End Sub Public Sub Create(iMaxSize As Integer) 'Initialise buffer If iMaxSize > 1 Then iMaxSze = iMaxSize ReDim vItm(iMaxSze) As Variant iHd = 1 iTl = 1 iSze = 0 mvariThreshold = 1 'Default threshold value Else MsgBox "Unable to create. Invalid buffer size.", vbOKOnly + vbExclamation, "Error" End If End Sub Public Sub PutItem(vItem As Variant) 'Write an element if buffer is not full or 'if buffer is full and bOverwriteScheme is True Dim bIsFull As Boolean Dim bOverwriteScheme As Boolean bIsFull = IsFull bOverwriteScheme = bIsFull And mvarbOverwriteOnFull If (Not bIsFull) Or bOverwriteScheme Then vItm(iHd) = vItem iSze = iSze + 1 iHd = (iHd Mod iMaxSze) + 1 '"Flush" buffer for overwrite scheme If bOverwriteScheme And iSze > iMaxSze Then iSze = iMaxSze iTl = iHd End If If iSze >= mvariThreshold Then RaiseEvent OnBuf End If End Sub Public Function GetItem() As Variant 'Read an element if buffer is not empty If Not IsEmpty Then GetItem = vItm(iTl) iSze = iSze - 1 iTl = (iTl Mod iMaxSze) + 1 End If End Function Public Function IsFull() As Boolean 'Check if buffer is full IsFull = False If iHd = iTl And iSze = iMaxSze Then 'full buffer condition IsFull = True RaiseEvent BufFull End If End Function Public Function IsEmpty() As Boolean 'Check if buffer is empty IsEmpty = False If iHd = iTl And iSze = 0 Then 'empty buffer condition IsEmpty = True RaiseEvent BufEmpty End If End Function Public Sub ClearBuffer() 'Clear buffer contents by resetting these: iHd = 1 iTl = 1 iSze = 0 End Sub Private Sub Class_Initialize() 'Default settings: mvarbOverwriteOnFull = False End Sub