ICTCLAS代碼學習筆記之Cqueue類

主要看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來實現,需要加入的一個成員變量記錄在瀏覽狀態下上次訪問的那個元素位置即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章