主要看Cqueue类,即Queue.h和Queue.cpp两个文件。Queue所包含的结点类型主要是用于处理最短路径时的相关信息,即
struct tagQueueElem{
unsigned int nParent; //!父结点的序号
unsigned int nIndex;//number of index in the parent node,父结点中的序号
ELEMENT_TYPE eWeight;//the weight of last path,路径的权重
struct tagQueueElem *next;
};
Cqueue类是一个有序的队列,主要提供pop和push的函数接口,需要注意的是,pop函数有两个附
带参数。另外还提供了判断是否为空及是否只有一个元素的函数接口,具体如下:
Push函数传入的三个参数分别是父结点的值,父结点中的索引及权重,push就是将其插入到合适的位置,单链表是按权重值从小到大排序的,所以严格的说并不是先进先出队列。
Pop的操作也与普通的pop函数不同,除了获取队列的第一个元素的相关值以外,bFirstGet用于判断是否是第一次取元素,这个标记帮助定位m_pLastAccess的位置到队列头部。另外一个变量bModify则用来标记是否在pop的同时删除这个元素,这两个变量不会同时生效,即如果是修改模式,则每次都是直接从头结点删除的,否则,使用m_pLastAccess来记录上一次取的位置。采用这样的消极浏览方式是有好处的,例如需要多次遍历队列时。
由于采取了上面这种消极的策略对于是否为空函数同时也需要提供一个标记,在浏览状态下判断m_pLastAccess是否到头,而在普通模式下判断头结点是否为空。
判断是否只有一个元素则没有区别浏览状态还是普通状态。
Cquece类的总结:
与其类名有一些出入,具体实现是一个以权重weight大小排序的单链表,对于相同大小权重的结点,则是后进来的排在前面。该类的优点在于提供了一个浏览状态和修改状态,以区别不同的pop操作,前者只是按顺序遍历整个链表,后者则同时删除第一个元素。可以考虑使用重载list来实现,需要加入的一个成员变量记录在浏览状态下上次访问的那个元素位置即可。
struct tagQueueElem{
unsigned int nParent; //!父结点的序号
unsigned int nIndex;//number of index in the parent node,父结点中的序号
ELEMENT_TYPE eWeight;//the weight of last path,路径的权重
struct tagQueueElem *next;
};
Cqueue类是一个有序的队列,主要提供pop和push的函数接口,需要注意的是,pop函数有两个附
带参数。另外还提供了判断是否为空及是否只有一个元素的函数接口,具体如下:
Push函数传入的三个参数分别是父结点的值,父结点中的索引及权重,push就是将其插入到合适的位置,单链表是按权重值从小到大排序的,所以严格的说并不是先进先出队列。
Pop的操作也与普通的pop函数不同,除了获取队列的第一个元素的相关值以外,bFirstGet用于判断是否是第一次取元素,这个标记帮助定位m_pLastAccess的位置到队列头部。另外一个变量bModify则用来标记是否在pop的同时删除这个元素,这两个变量不会同时生效,即如果是修改模式,则每次都是直接从头结点删除的,否则,使用m_pLastAccess来记录上一次取的位置。采用这样的消极浏览方式是有好处的,例如需要多次遍历队列时。
由于采取了上面这种消极的策略对于是否为空函数同时也需要提供一个标记,在浏览状态下判断m_pLastAccess是否到头,而在普通模式下判断头结点是否为空。
判断是否只有一个元素则没有区别浏览状态还是普通状态。
Cquece类的总结:
与其类名有一些出入,具体实现是一个以权重weight大小排序的单链表,对于相同大小权重的结点,则是后进来的排在前面。该类的优点在于提供了一个浏览状态和修改状态,以区别不同的pop操作,前者只是按顺序遍历整个链表,后者则同时删除第一个元素。可以考虑使用重载list来实现,需要加入的一个成员变量记录在浏览状态下上次访问的那个元素位置即可。