棧存入數(shù)據(jù),就像把東西往箱子里面放一樣,先放進(jìn)去的最后取出來。
如下圖所示:

動態(tài)棧圖.png
一個棧需要兩個指針標(biāo)識棧頂與棧底,棧頂以TOP標(biāo)識,棧底以BOTTOM來標(biāo)識。
棧底指針永遠(yuǎn)指向棧底元素。
代碼實(shí)現(xiàn):
typedef struct Node
{
int nData;
Node * pNext;
} * PNODE;
typedef struct Stack
{
PNODE pTop;
PNODE pBtm;
} *PSTACK;
void initStack(PSTACK pStack);
void push_Stack(PSTACK pStack, int nValue);
bool isEmpty_Stack(const PSTACK pStack);
void show_Stack(const PSTACK pStack);
void pop_Stack(PSTACK pStack);
int main()
{
Stack oStack;
initStack(&oStack);
push_Stack(&oStack, 1);
push_Stack(&oStack, 2);
push_Stack(&oStack, 3);
push_Stack(&oStack, 4);
push_Stack(&oStack, 5);
pop_Stack(&oStack);
pop_Stack(&oStack);
pop_Stack(&oStack);
show_Stack(&oStack);
}
void initStack(PSTACK pStack)
{
pStack->pBtm = (PNODE)malloc(sizeof(Node));
if (nullptr == pStack->pBtm)
{
std::cout << "內(nèi)存申請失敗!";
exit(-1);
}
pStack->pBtm->pNext = nullptr;
pStack->pTop = (PNODE)malloc(sizeof(Node));
if (nullptr == pStack->pTop)
{
std::cout << "內(nèi)存申請失敗!";
exit(-1);
}
pStack->pTop->pNext = pStack->pBtm;
}
void push_Stack(PSTACK pStack, int nValue)
{
//創(chuàng)建一個新節(jié)點(diǎn)
PNODE pNewNode = (PNODE)malloc(sizeof(Node));
if (nullptr == pNewNode)
{
std::cout << "內(nèi)存申請失敗!";
exit(-1);
}
pNewNode->nData = nValue;
PNODE pTempNode = pStack->pTop->pNext;
pNewNode->pNext = pTempNode;
pStack->pTop->pNext = pNewNode;
}
bool isEmpty_Stack(const PSTACK pStack)
{
if (pStack->pTop->pNext == pStack->pBtm)
{
return true;
}
return false;
}
void show_Stack(const PSTACK pStack)
{
if (isEmpty_Stack(pStack))
{
return;
}
PNODE pNode = pStack->pTop->pNext;
while (pNode != pStack->pBtm)
{
std::cout << pNode->nData << "\t";
pNode = pNode->pNext;
}
}
void pop_Stack(PSTACK pStack)
{
if (isEmpty_Stack(pStack))
{
return;
}
PNODE pTempNode = pStack->pTop->pNext;
pStack->pTop->pNext = pTempNode->pNext;
std::cout << "刪除的元素為:" << pTempNode->nData << "\n";
free(pTempNode);
}