前面我們講到了隊(duì)列,今天我們接著討論另外一種數(shù)據(jù)結(jié)構(gòu):堆棧。堆棧幾乎是程序設(shè)計(jì)的命脈,沒(méi)有堆棧就沒(méi)有函數(shù)調(diào)用,當(dāng)然也就沒(méi)有軟件設(shè)計(jì)。那么堆棧有什么特殊的屬性呢?其實(shí),堆棧的屬性主要表現(xiàn)在下面兩個(gè)方面:
(1)堆棧的數(shù)據(jù)是先入后出
(2)堆棧的長(zhǎng)度取決于棧頂?shù)母叨?/p>
那么,作為連續(xù)內(nèi)存類型的堆棧應(yīng)該怎么設(shè)計(jì)呢?大家可以自己先試一下:
(1)設(shè)計(jì)堆棧節(jié)點(diǎn)
typedef struct _STACK_NODE
{
int* pData;
int length;
int top;
}STACK_NODE;
(2)創(chuàng)建堆棧
STACK_NODE* alloca_stack(int number)
{
STACK_NODE* pStackNode = NULL;
if(0 == number)
return NULL;
pStackNode = (STACK_NODE*)malloc(sizeof(STACK_NODE));
assert(NULL != pStackNode);
memset(pStackNode, 0, sizeof(STACK_NODE));
pStackNode->pData = (int*)malloc(sizeof(int) * number);
if(NULL == pStackNode->pData){
free(pStackNode);
return NULL;
}
memset(pStackNode->pData, 0, sizeof(int) * number);
pStackNode-> length = number;
pStackNode-> top= 0;
return pStackNode;
}
(3)釋放堆棧
STATUS free_stack(const STACK_NODE* pStackNode)
{
if(NULL == pStackNode)
return FALSE;
assert(NULL != pStackNode->pData);
free(pStackNode->pData);
free((void*)pStackNode);
return TRUE;
}
(4)堆棧壓入數(shù)據(jù)
STATUS stack_push(STACK_NODE* pStackNode, int value)
{
if(NULL == pStackNode)
return FALSE;
if(pStackNode->length == pStackNode->top)
return FALSE;
pStackNode->pData[pStackNode->top ++] = value;
return TRUE;
}
(5)堆棧彈出數(shù)據(jù)
STATUS stack_pop(STACK_NODE* pStackNode, int* value)
{
if(NULL == pStackNode || NULL == value)
return FALSE;
if(0 == pStackNode->top)
return FALSE;
*value = pStackNode->pData[-- pStackNode->top];
return TRUE;
}
(6)統(tǒng)計(jì)當(dāng)前堆棧中包含多少數(shù)據(jù)
int count_stack_number(const STACK_NODE* pStackNode)
{
return pStackNode->top;
}
建議: 堆棧是函數(shù)調(diào)用的基礎(chǔ),是遞歸調(diào)用的基礎(chǔ),是很多問(wèn)題的根源,建議朋友們平時(shí)有時(shí)間好好練習(xí)一下。