一步一步寫算法(之線性堆棧) (轉)

 

   前面咱們講到了隊列,今天咱們接着討論另一種數據結構:堆棧。堆棧幾乎是程序設計的命脈,沒有堆棧就沒有函數調用,固然也就沒有軟件設計。那麼堆棧有什麼特殊的屬性呢?其實,堆棧的屬性主要表如今下面兩個方面:數據結構

    (1)堆棧的數據是先入後出函數

    (2)堆棧的長度取決於棧頂的高度spa

    那麼,做爲連續內存類型的堆棧應該怎麼設計呢?你們能夠本身先試一下:.net

    (1)設計堆棧節點設計

  1. typedef struct _STACK_NODE  
  2. {  
  3.     int* pData;  
  4.     int length;  
  5.     int top;  
  6. }STACK_NODE;  

    (2)建立堆棧blog

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

    (3)釋放堆棧遞歸

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

    (4)堆棧壓入數據隊列

  1. STATUS stack_push(STACK_NODE* pStackNode, int value)  
  2. {  
  3.     if(NULL == pStackNode)  
  4.         return FALSE;  
  5.           
  6.     if(pStackNode->length == pStackNode->top)  
  7.         return FALSE;  
  8.           
  9.     pStackNode->pData[pStackNode->top ++] = value;  
  10.     return TRUE;  
  11. }  

    (5)堆棧彈出數據內存

  1. STATUS stack_pop(STACK_NODE* pStackNode, int* value)  
  2. {  
  3.     if(NULL == pStackNode || NULL == value)  
  4.         return FALSE;  
  5.           
  6.     if(0 == pStackNode->top)  
  7.         return FALSE;  
  8.           
  9.     *value = pStackNode->pData[-- pStackNode->top];  
  10.     return TRUE;  
  11. }  

    (6)統計當前堆棧中包含多少數據get

  1. int count_stack_number(const STACK_NODE* pStackNode)  
  2. {  
  3.     return pStackNode->top;  
  4. }  


    建議: 堆棧是函數調用的基礎,是遞歸調用的基礎,是不少問題的根源,建議朋友們平時有時間好好練習一下。

 

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

相關文章
相關標籤/搜索