一步一步寫算法(之線性循環隊列) (轉)

 

    這裏的線性結構實際上指的就是連續內存的意思,只不過使用「線性」這個詞顯得比較專業而已。前面一篇博客介紹了現象結構的處理方法,那麼在這個基礎之上咱們是否是添加一些屬性造成一種新的數據結構類型呢?答案是確定的,隊列即是其中的一種。數據結構

    隊列的性質很簡單:spa

    (1)隊列有頭部和尾部.net

    (2)隊列從尾部壓入數據設計

    (3)隊列從頭部彈出數據blog

    那麼連續內存下的隊列是怎麼實現的呢?隊列

    a)設計隊列數據結構內存

  1. typedef struct _QUEUE_NODE  
  2. {  
  3.     int* pData;  
  4.     int length;  
  5.     int head ;  
  6.     int tail;  
  7.     int count;  
  8. }QUEUE_NODE;  

    b)申請隊列內存get

  1. QUEUE_NODE* alloca_queue(int number)  
  2. {  
  3.     QUEUE_NODE* pQueueNode;  
  4.     if( 0 == number)  
  5.         return NULL;  
  6.   
  7.     pQueueNode = (QUEUE_NODE*)malloc(sizeof(QUEUE_NODE));  
  8.     assert(NULL != pQueueNode);  
  9.     memset(pQueueNode, 0, sizeof(QUEUE_NODE));  
  10.   
  11.     pQueueNode->pData = (int*)malloc(sizeof(int) * number);  
  12.     if(NULL == pQueueNode->pData){  
  13.         free(pQueueNode);  
  14.         return NULL;  
  15.     }  
  16.   
  17.     pQueueNode->length = number;  
  18.     return pQueueNode;  
  19. }  

    c)釋放隊列內存博客

  1. STATUS delete_queue(const QUEUE_NODE* pQueueNode)  
  2. {  
  3.     if(NULL == pQueueNode)   
  4.         return FALSE;  
  5.       
  6.     assert(NULL != pQueueNode->pData);  
  7.       
  8.     free(pQueueNode->pData);  
  9.     free((void*)pQueueNode);  
  10.     return TRUE;  
  11. }  

    d)把數據壓入隊列class

  1. STATUS insert_queue(QUEUE_NODE* pQueueNode, int value)  
  2. {  
  3.     if(NULL == pQueueNode)  
  4.         return FALSE;  
  5.   
  6.     if(pQueueNode->length == pQueueNode->count)  
  7.         return FALSE;  
  8.   
  9.     pQueueNode->pData[pQueueNode->tail] = value;  
  10.     pQueueNode->tail = (pQueueNode->tail + 1) % pQueueNode->length;    
  11.     pQueueNode->count ++;  
  12.     return TRUE;  
  13. }  

    e)把數據彈出隊列

  1. STATUS get_queue_data(QUEUE_NODE* pQueueNode, int* value)  
  2. {  
  3.     if(NULL == pQueueNode || NULL == value)  
  4.         return FALSE;  
  5.   
  6.     if(0 == pQueueNode->count)  
  7.         return FALSE;  
  8.   
  9.     *value = pQueueNode->pData[pQueueNode->head];  
  10.     pQueueNode-> pData[pQueueNode->head] = 0;   
  11.     pQueueNode-> count --;  
  12.     pQueueNode->head = (pQueueNode->head + 1) % pQueueNode->length;  
  13.     return TRUE;  
  14. }  

    f)統計當前隊列中有多少數據

  1. int  get_total_number(const QUEUE_NODE* pQueueNode)  
  2. {  
  3.     if(NULL == pQueueNode)  
  4.         return 0;  
  5.   
  6.     return pQueueNode->count;  
  7. }  

    g)查看隊列中初始化的時候總長度是多少

  1. int  get_total_number(const QUEUE_NODE* pQueueNode)  
  2. {  
  3.     if(NULL == pQueueNode)  
  4.         return 0;  
  5.   
  6.     return pQueueNode->length;  
  7. }  


轉自:http://blog.csdn.net/feixiaoxing/article/details/6847885

相關文章
相關標籤/搜索