Queue.cpp
上传用户:yxl0916
上传日期:2007-05-25
资源大小:2245k
文件大小:3k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////
  2. //ICTCLAS简介:计算所汉语词法分析系统ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System),
  3. //             功能有:中文分词;词性标注;未登录词识别。
  4. //             分词正确率高达97.58%(973专家评测结果),
  5. //             未登录词识别召回率均高于90%,其中中国人名的识别召回率接近98%;
  6. //             处理速度为31.5Kbytes/s。
  7. //著作权:  Copyright?2002-2005中科院计算所 职务著作权人:张华平 刘群
  8. //遵循协议:自然语言处理开放资源许可证1.0
  9. //Email: zhanghp@software.ict.ac.cn
  10. //Homepage:www.nlp.org.cn;mtgroup.ict.ac.cn
  11. // Queue.cpp: implementation of the CQueue class.
  12. //
  13. //////////////////////////////////////////////////////////////////////
  14. #include "stdafx.h"
  15. #include "Queue.h"
  16. #include "malloc.h"
  17. #include "stdlib.h"
  18. #include "memory.h"
  19. //////////////////////////////////////////////////////////////////////
  20. // Construction/Destruction
  21. //////////////////////////////////////////////////////////////////////
  22. CQueue::CQueue()
  23. {
  24. m_pHead=NULL;
  25. m_pLastAccess=NULL;
  26. }
  27. CQueue::~CQueue()
  28. {
  29.    PQUEUE_ELEMENT pCur=m_pHead,pTemp;//The pointer of queue chain
  30.    while(pCur!=NULL)
  31.    {
  32.    pTemp=pCur->next;
  33.    delete pCur;
  34.    pCur=pTemp;
  35.    }
  36. }
  37. int CQueue::Push(unsigned int nValue,//The value for parent node
  38.  unsigned int nIndex,//number of index in the parent node
  39.                  ELEMENT_TYPE eWeight//the weight of last path 
  40.      )
  41. {//Sort it
  42.    PQUEUE_ELEMENT pAdd,pCur=m_pHead,pPre=0;//The pointer of queue chain
  43.    
  44.    while(pCur!=NULL&&pCur->eWeight<eWeight)
  45.    {//Get the proper posption,sort according the weight
  46.    pPre=pCur;
  47.    pCur=pCur->next;
  48.    }
  49.    pAdd=(PQUEUE_ELEMENT)new QUEUE_ELEMENT;
  50.    pAdd->nParent=nValue;
  51.    pAdd->nIndex=nIndex;
  52.    pAdd->eWeight=eWeight;
  53.    pAdd->next=pCur;
  54.    if(pPre==0)
  55.    m_pHead=pAdd;
  56.    else
  57.    pPre->next=pAdd;
  58.    return 1;
  59. }
  60. int CQueue::Pop(unsigned int *npValue,//The value for parent node
  61. unsigned int *npIndex,//number of index in the parent node
  62.                 ELEMENT_TYPE *epWeight,//the weight of last path 
  63.                 bool  bModify,//not modify the data 
  64. bool  bFirstGet//first get data,just for browse 
  65.    )
  66. {
  67. PQUEUE_ELEMENT pTemp;
  68. if(bModify) 
  69. pTemp=m_pHead;//The temp buffer
  70. else 
  71. {
  72.   if(bFirstGet)//First get the data
  73.      m_pLastAccess=m_pHead;//The temp buffer
  74.   pTemp=m_pLastAccess;
  75. }
  76. if(pTemp==NULL)
  77. return -1;//fail get the value
  78.     if(npValue!=0)
  79.        *npValue=pTemp->nParent;
  80.     if(npIndex!=0)
  81.        *npIndex=pTemp->nIndex;
  82.     if(epWeight!=0)
  83.   *epWeight=pTemp->eWeight;
  84.     if(bModify)//modify and get rid of the node
  85. {
  86.      m_pHead=pTemp->next;
  87.    delete pTemp;//free the buffer
  88. }
  89. else
  90. {
  91.        m_pLastAccess=pTemp->next;
  92.     }
  93.      return 1;
  94. }
  95. bool CQueue::IsEmpty(bool bBrowsed)//bBrowsed=true: judge whether the browse pointer got end.
  96. {
  97. if(bBrowsed==true)
  98. return (m_pLastAccess==NULL);
  99.    return (m_pHead==NULL);
  100. }
  101. bool CQueue::IsSingle()
  102. {
  103.    return (m_pHead!=NULL&&m_pHead->next==NULL);
  104. }