用VB实现循环队列算法收藏
在日常代码编制时,许多人会忽略一些最基本的算法,导致代码冗余,思路不清楚。我曾经至少两次在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实现循环队列算法收藏相关推荐
- JAVA:实现一个CircularQueue循环队列算法(附完整源码)
JAVA:实现一个CircularQueue循环队列算法 package com.thealgorithms.datastructures.queues; public class CircularQ ...
- C++使用linked list(链表)实现circular queue(循环队列)(附完整源码)
使用linked lis实现circular queue node结构体定义 使用linked list(链表)实现circular queue(循环队列)算法的完整源码(定义,实现,main函数测试 ...
- 数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)
目录 一.顺序队列 1.存储结构 2.入队和出队 总代码 二.循环队列 总代码: 三.链队列 1.存储结构 2.入队和出队 总代码 一.顺序队列 队列特征:先进后出.后进后出. 1.存储结构 //队列 ...
- 循环队列,定义循环队列长度为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< ...
- 循环队列的进队算法c语言,循环队列的定义,入队算法,出队算法,遍历算法,及其代码实现-Go语言中文社区...
队列 的定义: 一种可以是实现"先进先出"的存储结构.数据的进出类似于排队购票.队只允许队尾一端(rear)添加,在另一端队头(front)删除.队有队头(front)和队尾(re ...
- 数据结构与算法之循环队列的操作
数据结构与算法之循环队列的操作 /* 循环队列的入队和出队算法设计 初始化循环队列 .打印队列.插入元素到循环队列.获取循环队列的首元素,元素不出队.出队.获取循环队列元素个数.判断循环队列的空和满. ...
- 以域变量rear和length分别指示循环队列中队尾元素的位置和内含元素的个数。给出队满条件和相应的如对和出队算法。
以域变量rear和length分别指示循环队列中队尾 元素的位置和内含元素的个数.给出队满条件和相应的如对和出队算法. /* 以域变量rear和length分别指示循环队列中队尾 元素的位置和内含元素 ...
- 考研数据结构之队列(3.3)——练习题之设计一个循环队列,用front和rear分别作为队头和队尾指针,另外用一个标志tag表示队列是空还是不空来设计队列的结构和相关基本运算算法(C表示)
题目 设计一个循环队列,用front和rear分别作为队头和队尾指针,另外用一个标志tag表示队列是空还是不空,约定当tag为0时队空,当tag为1时队不空,这样就可以用front==rear作为队满 ...
- java循环队列入队出队算法_循环队列实现
生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题:从生活中,可以抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结构 ...
最新文章
- yii2服务器无法加载文件,yii2查看服务器500错误的方法
- 模板or定制网站如何选?
- WC2007 石头剪刀布 数学+最小费用最大流
- VS2008如何自动添加消息映射
- fft重叠帧_关于FFT实时频谱的几个基本概念 | 科创仪表局
- MySQL--开发技巧(一)
- 在连续发布版本的情况下 如何做好测试?
- jsp怎么调用servlet_Servlet简述
- BeanShell异常处理
- android-support-v7-appcompat的配置使用
- mysql的条件求和函数_使用SQL语句统计数据时sum和count函数中使用if判断条件的讲解...
- vs code调试console程序报错--preLaunchTask“build”
- mp2551总线收发器芯片作用_什么是现场总线,为什么需要隔离处理?
- office 2016 word文档另存为pdf之后文本内容显示不全
- 科学计算机使用的软件,科学计算器软件有哪些?2020好用的科学计算器推荐
- php删除文件还能修复吗,删除文件恢复
- 技术能力和工作能力的联系和区别
- 在QPixmap的图片上添加文字
- 如何禁止福昕阅读器改变PDF页面缩放比例?
- Word中如何将英文双引号替换成中文双引号