[AS2,数据结构]队列的实现: (Implementation Data Structure in ActionScript2.0---Queue)
By EmilMatthew 05/9/6
ActionScript2.0,一种在语法上接近于Java + Pascal的面向对象的脚本语言.如今,伴随着Flash8的发行,使得这种脚本语言添加了运行速度更加快捷,后台技术连接的更加方便等优点.
而Flash Player的普及性及高传播性更是无庸置疑的.所以,只要你愿意的话,就可以在Flash中实现自己的梦想.
今天,我要开始一个新的系列---数据结构及经典算法在AS2中的实现,置于数据结构及算法有什么用吗?呵呵,需要的人一定有用,不需要的人不学也无妨啊.感兴趣的朋友就请继续吧.
1队列的解释:
队列是什么?想像一下你排队买午饭的情形,如果没有人插队的话,应该项是先来的人先买饭,然后离开队伍,而后来的人呢,只能排在队伍的未尾.这样的一种情形,便是队列的最好说明.
有关队列的一些细节上的内容请,请参考:
http://www.fosu.edu.cn/gong/schoolweb/class/023142/news/2004-3-31/200433118453.htm
http://zh.wikipedia.org/wiki/%E8%B2%AF%E5%88%97
我这里主要是给出我的队列在AS2中的实现:
请参考我做的演示:
http://www.flash8.net/bbs/UploadFile/2005-9/200596125130843.swf
a)首先给出的是结点类,由于AS2的很多机制和JAVA非常类似,所以,它构造的数据结构很大程度上非常接近JAVA风格的数据结构.
import eQueue.*;
class eQueue.eNode extends eObject
{
public var mData:Object;
//充分利用动态语言的特性,得到一个什么都数据类型的数据都可以包含进去的队列,
public var mNextNode:eNode;
public function eNode(inData:Object)
{
if(inData==undefined||inData==null)//针对没有传入参数的处理
mData=0;
else
mData=inData;
mNextNode=null;
}
}
b)第二个给出的是队列类的主类定义:
import eQueue.*;
class eQueue.eQueue extends eObject
{
private var mFrontNode:eNode;
private var mRearNode:eNode;
public function eQueue(inData:Object)//Constructor
{
mFrontNode=new eNode(inData);
mFrontNode.mNextNode=mRearNode;
}
public function isEmpty():Boolean
{
return mFrontNode==null;
}
public function front():Object
{
assertDebug(mFrontNode!=null,"the front node is null\n");
return mFrontNode.mData;
}
public function last():Object
{
assertDebug(mRearNode!=null,"the last node is null\n");
return mRearNode.mData;
}
public function enQueue(inData:Object):Void//进队列
{
if(mFrontNode==null)//front:null,rear:null
{
mFrontNode=new eNode(inData);
}
else if(mRearNode==null)//front:unNull,rear:null
{
mRearNode=new eNode(inData);
mFrontNode.mNextNode=mRearNode;
}
else //front:unNull,rear:unNull.
{
var tmpNode:eNode=new eNode(inData);
/*Aoply new mem for a node,注意,正是这种申请内存的方式可以实现,才导致这种基于链表的,具有极高柔韧性的队列得以实现.*/
mRearNode.mNextNode=tmpNode;
mRearNode=tmpNode;
}
}
public function deQueue():Object
{
assertDebug(mFrontNode!=null,"in dequeue,mFrontNode is null\n");
var tmpData:Object=new Object();
var tmpNode:eNode=new eNode(0);
tmpNode=mFrontNode.mNextNode;
tmpData=mFrontNode.mData;
if(mFrontNode==mRearNode)
{//if the queue only has one node,and both front and rear point to it.
delete mFrontNode;
delete mRearNode;
mFrontNode=null;
mRearNode=null;
}
else //norm condition,including front:unNull,rear:null
{
delete mFrontNode;//release the unused mem.
mFrontNode=tmpNode;
}
return tmpData;
}
public function traversal():Void//遍历队列元素
{
var tmpNode:eNode=new eNode();
tmpNode=mFrontNode;
trace3("==starting of queue traversal==\n");
while(tmpNode)
{
trace3(String(tmpNode.mData)+"\n");
tmpNode=tmpNode.mNextNode;
}
trace3("==end of queue traversal==\n");
tmpNode=null;
delete tmpNode;
}
public function getLen():Number//返回队列长度
{
var tmpNode:eNode=new eNode();
var num:Number=0;
tmpNode=mFrontNode;
while(tmpNode)
{
tmpNode=tmpNode.mNextNode;
num++;
}
delete tmpNode;
return num;
}
public function finallize():Void//release the queue mem,内存回收与释放.
{
var tmpNode:eNode=new eNode();
//assertion if mFrontNode is null is no needed.
while(mFrontNode)
{
tmpNode=mFrontNode.mNextNode;
mFrontNode=null;
delete mFrontNode;//free the mem.
mFrontNode=tmpNode;
}
delete mRearNode;
}
}
c)好了,这就是我用AS2实现的最基本的队列这种数据结构了,如果你发现它有什么BUG或者有什么改进意见,请一定要告诉我哟~~~~
我的演示程序的源码下载:
http://free3.e-168.cn/as2forward/downloads/as2Queue.rar
//如果上面这个链接无法响应下载(有可能是被网站给屏蔽掉了),则可使用下载工具(如迅雷等)下载。