在日常代码编制时,许多人会忽略一些最基本的算法,导致代码冗余,思路不清楚。我曾经至少两次在CSDN里遇到这类问题:我想在页面的右边显示一个列表,列表长度为20,新加入一个用户后,显示在列表开头,再加入的用户,显示在这个用户的下边,当用户数量超过20后,挤掉最前面的那一位,第二位加入的用户成了第一位,依次循环,保证列表最多显示20位用户。当然,实际问题可能与此有些出入,比如Coder是想显示网友们最近选择的歌曲列表,但实际意思差不多。

面对这个问题,大多数朋友会想到使用数据。其实,这完全是一个队列,只不过,这个队列可以循环使用,在加入队列元素时,如果超过长度,会自动挤掉最先加入的。如果能够用代码直接实现,为什么要用数据库呢?考虑一下,为了提高网站性能,我们绞尽脑汁,却往往因为思路的偏差,导致性能降低。

那么,在VB中如何实现可循环的队列呢?

为此,我编写了一个循环队列类,以满足上述需要,同时为了方便在HTML、ASP、WSH的VBScript脚本语言环境中使用,该类未声明任何数据类型。

首先看一下该循环队列类的源代码:

'* ************************************************************** *  
'*    程序名称:Queue.cls  
'*    程序功能:一个VB循环队列类  
'*    作者:lyserver  
'*    联系方式:http://blog.csdn.net/lyserver  
'* ************************************************************** *  
'Class Queue '在ASP、WSH、HTML的VBScript脚本中使用时需加此句  
    Dim m_Queue() '队列  
    Dim m_RetQueue() '队列返回值  
    Dim m_ReadIndex '列首偏移索引  
    Dim m_WriteIndex '元素插入偏移索引  
    Dim m_MaxLen '队列最大尺寸  
      
    Private Sub Class_Initialize()  
        m_ReadIndex = 0  
        m_WriteIndex = 0  
        m_MaxLen = 20 '队列默认大小为20  
        ReDim m_Queue(m_MaxLen - 1)  
    End Sub 
      
    Private Sub Class_Terminate()  
        Erase m_Queue  
        Erase m_RetQueue  
    End Sub 
      
    '获得队列大小  
    Public Property Get MaxLen()  
        MaxLen = m_MaxLen  
    End Property 
      
    '设置队列大小  
    Public Property Let MaxLen(ByVal NewValue)  
        If NewValue > 0 Then 
            m_MaxLen = NewValue  
            ReDim m_Queue(m_MaxLen)  
        End If 
    End Property 
      
    '插入队列元素  
    Public Sub Insert(ByVal v)  
        If m_WriteIndex = m_MaxLen Then '队列已满,挤掉最先插入的元素  
            m_WriteIndex = 0  
            m_ReadIndex = (m_ReadIndex + 1) Mod m_MaxLen  
        End If 
        m_Queue(m_WriteIndex) = v  
        m_WriteIndex = m_WriteIndex + 1  
    End Sub 
      
    '删除队列元素(按队列原则,实际上是删除最先插入的元素)  
    Public Sub Delete()  
        Dim vTemp  
        m_Queue(m_ReadIndex) = vTemp '将此变量置为未初始化  
        m_ReadIndex = (m_ReadIndex + 1) Mod m_MaxLen  
    End Sub 
      
    '清空队列  
    Public Sub Clear()  
        ReDim m_Queue(m_MaxLen)  
        m_WriteIndex = 0  
        m_ReadIndex = 0  
    End Sub 
      
    '获得队列数组  
    Public Property Get GetQueue()  
        Dim i, n  
          
        n = 0  
        ReDim m_RetQueue(m_MaxLen)  
        For i = m_ReadIndex To m_MaxLen - 1  
            If IsEmpty(m_Queue(i)) Then Exit For 
            m_RetQueue(n) = m_Queue(i)  
            n = n + 1  
        Next 
        For i = 0 To m_ReadIndex - 1  
            If IsEmpty(m_Queue(i)) Then Exit For 
            m_RetQueue(n) = m_Queue(i)  
            n = n + 1  
        Next 
        GetQueue = m_RetQueue  
    End Property 
'End Class '在ASP、WSH、HTML的VBScript脚本中使用时需加此句 
'* ************************************************************** *
'*    程序名称:Queue.cls
'*    程序功能:一个VB循环队列类
'*    作者:lyserver
'*    联系方式:http://blog.csdn.net/lyserver
'* ************************************************************** *
'Class Queue '在ASP、WSH、HTML的VBScript脚本中使用时需加此句
    Dim m_Queue() '队列
    Dim m_RetQueue() '队列返回值
    Dim m_ReadIndex '列首偏移索引
    Dim m_WriteIndex '元素插入偏移索引
    Dim m_MaxLen '队列最大尺寸
   
    Private Sub Class_Initialize()
        m_ReadIndex = 0
        m_WriteIndex = 0
        m_MaxLen = 20 '队列默认大小为20
        ReDim m_Queue(m_MaxLen - 1)
    End Sub
   
    Private Sub Class_Terminate()
        Erase m_Queue
        Erase m_RetQueue
    End Sub
   
    '获得队列大小
    Public Property Get MaxLen()
        MaxLen = m_MaxLen
    End Property
   
    '设置队列大小
    Public Property Let MaxLen(ByVal NewValue)
        If NewValue > 0 Then
            m_MaxLen = NewValue
            ReDim m_Queue(m_MaxLen)
        End If
    End Property
   
    '插入队列元素
    Public Sub Insert(ByVal v)
        If m_WriteIndex = m_MaxLen Then '队列已满,挤掉最先插入的元素
            m_WriteIndex = 0
            m_ReadIndex = (m_ReadIndex + 1) Mod m_MaxLen
        End If
        m_Queue(m_WriteIndex) = v
        m_WriteIndex = m_WriteIndex + 1
    End Sub
   
    '删除队列元素(按队列原则,实际上是删除最先插入的元素)
    Public Sub Delete()
        Dim vTemp
        m_Queue(m_ReadIndex) = vTemp '将此变量置为未初始化
        m_ReadIndex = (m_ReadIndex + 1) Mod m_MaxLen
    End Sub
   
    '清空队列
    Public Sub Clear()
        ReDim m_Queue(m_MaxLen)
        m_WriteIndex = 0
        m_ReadIndex = 0
    End Sub
   
    '获得队列数组
    Public Property Get GetQueue()
        Dim i, n
       
        n = 0
        ReDim m_RetQueue(m_MaxLen)
        For i = m_ReadIndex To m_MaxLen - 1
            If IsEmpty(m_Queue(i)) Then Exit For
            m_RetQueue(n) = m_Queue(i)
            n = n + 1
        Next
        For i = 0 To m_ReadIndex - 1
            If IsEmpty(m_Queue(i)) Then Exit For
            m_RetQueue(n) = m_Queue(i)
            n = n + 1
        Next
        GetQueue = m_RetQueue
    End Property
'End Class '在ASP、WSH、HTML的VBScript脚本中使用时需加此句

然后,我们再来看一下在VB中如何使用此类:

Sub main()  
    Dim objQueue  
    Dim i, nLen  
      
    Set objQueue = New Queue  
    '将队列长度置为5  
    nLen = 5  
    objQueue.MaxLen = nLen  
      
    '向队列插入元素(不超过队列长度)  
    For i = 1 To nLen  
        objQueue.Insert i  
    Next 
    '显示结果  
    DisplayQueue objQueue  
 
    '清空队列后重新插入元素(超过队列长度)  
    objQueue.Clear  
    For i = 1 To nLen + 1  
        objQueue.Insert i  
    Next 
    '显示结果  
    DisplayQueue objQueue  
      
    '删除队列元素  
    objQueue.Delete  
    '显示结果  
    DisplayQueue objQueue  
End Sub 
 
Private Sub DisplayQueue(qu)  
    Dim v(), i  
    v = qu.GetQueue  
    For i = 0 To qu.MaxLen - 1  
        If IsEmpty(v(i)) Then Exit For 
        Debug.Print "第" & i + 1 & "个元素的值:", v(i)  
    Next 
    Debug.Print "------显示完毕------" 
End Sub 
Sub main()
    Dim objQueue
    Dim i, nLen
   
    Set objQueue = New Queue
    '将队列长度置为5
    nLen = 5
    objQueue.MaxLen = nLen
   
    '向队列插入元素(不超过队列长度)
    For i = 1 To nLen
        objQueue.Insert i
    Next
    '显示结果
    DisplayQueue objQueue

'清空队列后重新插入元素(超过队列长度)
    objQueue.Clear
    For i = 1 To nLen + 1
        objQueue.Insert i
    Next
    '显示结果
    DisplayQueue objQueue
   
    '删除队列元素
    objQueue.Delete
    '显示结果
    DisplayQueue objQueue
End Sub

Private Sub DisplayQueue(qu)
    Dim v(), i
    v = qu.GetQueue
    For i = 0 To qu.MaxLen - 1
        If IsEmpty(v(i)) Then Exit For
        Debug.Print "第" & i + 1 & "个元素的值:", v(i)
    Next
    Debug.Print "------显示完毕------"
End Sub

看过了VB使用方法后,我们再来看一下在HTML的VBScript脚本中如何使用,需要注意的是,要想测试结果,必须将以下代码复制到记事本后另存为扩展名为html或htm的文件,然后使用IE打开,对于类代码,读者也可以单独取出来存为vbs文件,然后html里包含它就可以了。至于ASP,思路与此完全一样。

<html> 
 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
<title>新建网页 1</title> 
</head> 
 
<body> 
</body> 
</html> 
<mce:script language=vbscript><!--  
Option Explicit  
'* ************************************************************** *  
'*    程序名称:Queue.cls  
'*    程序功能:一个VB循环队列类  
'*    作者:lyserver  
'*    联系方式:http://blog.csdn.net/lyserver  
'* ************************************************************** *  
Class Queue  
    Dim m_Queue() '队列  
    Dim m_RetQueue() '队列返回值  
    Dim m_ReadIndex '列首偏移索引  
    Dim m_WriteIndex '元素插入偏移索引  
    Dim m_MaxLen '队列最大尺寸  
      
    Private Sub Class_Initialize()  
        m_ReadIndex = 0 
        m_WriteIndex = 0 
        m_MaxLen = 20 '队列默认大小为20  
        ReDim m_Queue(m_MaxLen - 1)  
    End Sub  
      
    Private Sub Class_Terminate()  
        Erase m_Queue  
        Erase m_RetQueue  
    End Sub  
      
    '获得队列大小  
    Public Property Get MaxLen()  
        MaxLen = m_MaxLen 
    End Property  
      
    '设置队列大小  
    Public Property Let MaxLen(ByVal NewValue)  
        If NewValue > 0 Then  
            m_MaxLen = NewValue 
            ReDim m_Queue(m_MaxLen)  
        End If  
    End Property  
      
    '插入队列元素  
    Public Sub Insert(ByVal v)  
        If m_WriteIndex = m_MaxLen Then '队列已满,挤掉最先插入的元素  
            m_WriteIndex = 0 
            m_ReadIndex = (m_ReadIndex + 1) Mod m_MaxLen  
        End If  
        m_Queue(m_WriteIndex) = v  
        m_WriteIndexm_WriteIndex = m_WriteIndex + 1  
    End Sub  
      
    '删除队列元素(按队列原则,实际上是删除最先插入的元素)  
    Public Sub Delete()  
        Dim vTemp  
        m_Queue(m_ReadIndex) = vTemp '将此变量置为未初始化  
        m_ReadIndex = (m_ReadIndex + 1) Mod m_MaxLen  
    End Sub  
      
    '清空队列  
    Public Sub Clear()  
        ReDim m_Queue(m_MaxLen)  
        m_WriteIndex = 0 
        m_ReadIndex = 0 
    End Sub  
      
    '获得队列数组  
    Public Property Get GetQueue()  
        Dim i, n  
          
        n = 0 
        ReDim m_RetQueue(m_MaxLen)  
        For i = m_ReadIndex To m_MaxLen - 1  
            If IsEmpty(m_Queue(i)) Then Exit For  
            m_RetQueue(n) = m_Queue(i)  
            nn = n + 1  
        Next  
        For i = 0 To m_ReadIndex - 1  
            If IsEmpty(m_Queue(i)) Then Exit For  
            m_RetQueue(n) = m_Queue(i)  
            nn = n + 1  
        Next  
        GetQueue = m_RetQueue 
    End Property  
 
End Class  
 
Sub window_onload  
    Dim objQueue  
    Dim i, nLen  
 
    Set objQueue=New Queue  
 
    '将队列长度置为5  
    nLen = 5 
    objQueue.MaxLen = nLen 
      
    '向队列插入元素(不超过队列长度)  
    For i = 1 To nLen  
        objQueue.Insert i  
    Next  
    '显示结果  
    DisplayQueue objQueue  
 
    '清空队列后重新插入元素(超过队列长度)  
    objQueue.Clear  
    For i = 1 To nLen + 1  
        objQueue.Insert i  
    Next  
    '显示结果  
    DisplayQueue objQueue  
      
    '删除队列元素  
    objQueue.Delete  
    '显示结果  
    DisplayQueue objQueue  
End Sub  
 
Sub DisplayQueue(qu)  
    Dim v,i  
    v = qu.GetQueue  
    For i = 0 To qu.MaxLen - 1  
        If IsEmpty(v(i)) Then Exit For  
        document.write "第" & i + 1 & "个元素的值:" & v(i) & "<br>"  
    Next  
    document.write "------显示完毕------<br>"  
End Sub  
// --></mce:script> 
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>新建网页 1</title>
</head>

<body>
</body>
</html>
<mce:script language=vbscript><!--
Option Explicit
'* ************************************************************** *
'*    程序名称:Queue.cls
'*    程序功能:一个VB循环队列类
'*    作者:lyserver
'*    联系方式:http://blog.csdn.net/lyserver
'* ************************************************************** *
Class Queue
 Dim m_Queue() '队列
 Dim m_RetQueue() '队列返回值
 Dim m_ReadIndex '列首偏移索引
 Dim m_WriteIndex '元素插入偏移索引
 Dim m_MaxLen '队列最大尺寸
 
 Private Sub Class_Initialize()
     m_ReadIndex = 0
     m_WriteIndex = 0
     m_MaxLen = 20 '队列默认大小为20
     ReDim m_Queue(m_MaxLen - 1)
 End Sub
 
 Private Sub Class_Terminate()
     Erase m_Queue
     Erase m_RetQueue
 End Sub
 
 '获得队列大小
 Public Property Get MaxLen()
     MaxLen = m_MaxLen
 End Property
 
 '设置队列大小
 Public Property Let MaxLen(ByVal NewValue)
     If NewValue > 0 Then
         m_MaxLen = NewValue
         ReDim m_Queue(m_MaxLen)
     End If
 End Property
 
 '插入队列元素
 Public Sub Insert(ByVal v)
     If m_WriteIndex = m_MaxLen Then '队列已满,挤掉最先插入的元素
         m_WriteIndex = 0
         m_ReadIndex = (m_ReadIndex + 1) Mod m_MaxLen
     End If
     m_Queue(m_WriteIndex) = v
     m_WriteIndex = m_WriteIndex + 1
 End Sub
 
 '删除队列元素(按队列原则,实际上是删除最先插入的元素)
 Public Sub Delete()
     Dim vTemp
     m_Queue(m_ReadIndex) = vTemp '将此变量置为未初始化
     m_ReadIndex = (m_ReadIndex + 1) Mod m_MaxLen
 End Sub
 
 '清空队列
 Public Sub Clear()
     ReDim m_Queue(m_MaxLen)
     m_WriteIndex = 0
     m_ReadIndex = 0
 End Sub
 
 '获得队列数组
 Public Property Get GetQueue()
     Dim i, n
    
     n = 0
     ReDim m_RetQueue(m_MaxLen)
     For i = m_ReadIndex To m_MaxLen - 1
         If IsEmpty(m_Queue(i)) Then Exit For
         m_RetQueue(n) = m_Queue(i)
         n = n + 1
     Next
     For i = 0 To m_ReadIndex - 1
         If IsEmpty(m_Queue(i)) Then Exit For
         m_RetQueue(n) = m_Queue(i)
         n = n + 1
     Next
     GetQueue = m_RetQueue
 End Property

End Class

Sub window_onload
    Dim objQueue
    Dim i, nLen

Set objQueue=New Queue

'将队列长度置为5
    nLen = 5
    objQueue.MaxLen = nLen
   
    '向队列插入元素(不超过队列长度)
    For i = 1 To nLen
        objQueue.Insert i
    Next
    '显示结果
    DisplayQueue objQueue

'清空队列后重新插入元素(超过队列长度)
    objQueue.Clear
    For i = 1 To nLen + 1
        objQueue.Insert i
    Next
    '显示结果
    DisplayQueue objQueue
   
    '删除队列元素
    objQueue.Delete
    '显示结果
    DisplayQueue objQueue
End Sub

Sub DisplayQueue(qu)
    Dim v,i
    v = qu.GetQueue
    For i = 0 To qu.MaxLen - 1
        If IsEmpty(v(i)) Then Exit For
        document.write "第" & i + 1 & "个元素的值:" & v(i) & "<br>"
    Next
    document.write "------显示完毕------<br>"
End Sub
// --></mce:script>

怎么样?如果读者觉得不满意,欢迎您留下宝贵的意见!

发表于 @ 2009年05月04日 00:15:00|评论(0)|举报|收藏

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lyserver/archive/2009/05/04/4146805.aspx

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lyserver/archive/2009/05/04/4146805.aspx

用VB实现循环队列算法收藏相关推荐

  1. JAVA:实现一个CircularQueue循环队列算法(附完整源码)

    JAVA:实现一个CircularQueue循环队列算法 package com.thealgorithms.datastructures.queues; public class CircularQ ...

  2. C++使用linked list(链表)实现circular queue(循环队列)(附完整源码)

    使用linked lis实现circular queue node结构体定义 使用linked list(链表)实现circular queue(循环队列)算法的完整源码(定义,实现,main函数测试 ...

  3. 数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)

    目录 一.顺序队列 1.存储结构 2.入队和出队 总代码 二.循环队列 总代码: 三.链队列 1.存储结构 2.入队和出队 总代码 一.顺序队列 队列特征:先进后出.后进后出. 1.存储结构 //队列 ...

  4. 循环队列,定义循环队列长度为10,编写初始化队列、入队、出队、求队长,实现10,20,30,40,50,60,70,80入队,10,20,30出队,56,67入队的算法功能。

    循环队列,定义循环队列长度为10,编写初始化队列.入队.出队.求队长,实现10,20,30,40,50,60,70,80入队,10,20,30出队,56,67入队的算法功能. #include< ...

  5. 循环队列的进队算法c语言,循环队列的定义,入队算法,出队算法,遍历算法,及其代码实现-Go语言中文社区...

    队列 的定义: 一种可以是实现"先进先出"的存储结构.数据的进出类似于排队购票.队只允许队尾一端(rear)添加,在另一端队头(front)删除.队有队头(front)和队尾(re ...

  6. 数据结构与算法之循环队列的操作

    数据结构与算法之循环队列的操作 /* 循环队列的入队和出队算法设计 初始化循环队列 .打印队列.插入元素到循环队列.获取循环队列的首元素,元素不出队.出队.获取循环队列元素个数.判断循环队列的空和满. ...

  7. 以域变量rear和length分别指示循环队列中队尾元素的位置和内含元素的个数。给出队满条件和相应的如对和出队算法。

    以域变量rear和length分别指示循环队列中队尾 元素的位置和内含元素的个数.给出队满条件和相应的如对和出队算法. /* 以域变量rear和length分别指示循环队列中队尾 元素的位置和内含元素 ...

  8. 考研数据结构之队列(3.3)——练习题之设计一个循环队列,用front和rear分别作为队头和队尾指针,另外用一个标志tag表示队列是空还是不空来设计队列的结构和相关基本运算算法(C表示)

    题目 设计一个循环队列,用front和rear分别作为队头和队尾指针,另外用一个标志tag表示队列是空还是不空,约定当tag为0时队空,当tag为1时队不空,这样就可以用front==rear作为队满 ...

  9. java循环队列入队出队算法_循环队列实现

    生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题:从生活中,可以抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结构 ...

最新文章

  1. yii2服务器无法加载文件,yii2查看服务器500错误的方法
  2. 模板or定制网站如何选?
  3. WC2007 石头剪刀布 数学+最小费用最大流
  4. VS2008如何自动添加消息映射
  5. fft重叠帧_关于FFT实时频谱的几个基本概念 | 科创仪表局
  6. MySQL--开发技巧(一)
  7. 在连续发布版本的情况下 如何做好测试?
  8. jsp怎么调用servlet_Servlet简述
  9. BeanShell异常处理
  10. android-support-v7-appcompat的配置使用
  11. mysql的条件求和函数_使用SQL语句统计数据时sum和count函数中使用if判断条件的讲解...
  12. vs code调试console程序报错--preLaunchTask“build”
  13. mp2551总线收发器芯片作用_什么是现场总线,为什么需要隔离处理?
  14. office 2016 word文档另存为pdf之后文本内容显示不全
  15. 科学计算机使用的软件,科学计算器软件有哪些?2020好用的科学计算器推荐
  16. php删除文件还能修复吗,删除文件恢复
  17. 技术能力和工作能力的联系和区别
  18. 在QPixmap的图片上添加文字
  19. 如何禁止福昕阅读器改变PDF页面缩放比例?
  20. Word中如何将英文双引号替换成中文双引号

热门文章

  1. python中dir用法_Python内置函数dir详解
  2. 关于排序速度效率数组集合选择那点事
  3. Java设计模式——工厂模式
  4. C语言流程控制语句——3个循环语句和一个条件语句
  5. 实现公司管理系统【C++实战】(53)
  6. sql语句常见问题集锦
  7. java简单介绍_java 简单介绍
  8. 2019CCPC网络选拔赛签到题题解
  9. github mysql 数据恢复_记一次MySQL删库的数据恢复
  10. html5变动标签新写法,Html5新标签解释及用法