一、說明
棧的操作比較簡單
儲存一個棧頂 top 指標
壓棧時,就將節點 鏈在 top之後
彈棧時,就將top的next 節點刪除即可
同 鏈式隊列的實現,top指標所指節點始終為無效節點
實現方法,也同 鏈式隊列類似
二、實現
/*****************************************************************<br />*功 能: 實現棧基本操作<br />*描 述: 實現棧的鏈式儲存,及其相關操作<br />*方 法:分配一塊記憶體,棧頂top指標指向該塊記憶體,<br /> 但這一塊記憶體,是不儲存有效資料的,<br />操作過程中,top指向的記憶體始終是不儲存有效資料的,<br />於是棧判空條件就是 top.next==NULL<br />相當於 浪費了一個棧元素大小(sizeof(Node))的記憶體區,<br />但為程式實現提供了極大方便<br />*時 間: 2010-11-28<br />******************************************************************/ </p><p>#include <stdio.h><br />#include <malloc.h></p><p>//---------------------------資料結構定義---------------------------------------------</p><p>typedef int ElemType;</p><p>typedef struct Node{ //棧節點結構定義<br />ElemType value; //節點的值<br />struct Node* next; //下一個節點地址<br />}Node;</p><p>typedef struct{ //棧結構定義<br />Node* top; //棧頂<br />//Node* base; //棧底 鏈式棧中 base作用不大<br />}Stack;</p><p>//--------------------------棧操作------------------------------------------------</p><p>//初始化棧<br />void InitStack(Stack* stack){<br />stack->top /*= stack->base*/ = (Node*)malloc(sizeof(Node));<br />stack->top->next = NULL; //也就等同於 rear->next = NULL<br />}</p><p>//清空棧<br />void Clean(Stack* stack){<br />Node* pNode,*tmp;<br />pNode = stack->top->next;<br />while(pNode != NULL){ //遍曆棧,釋放每一塊節點記憶體<br />tmp = pNode; //記錄下要釋放的記憶體位址<br />pNode = pNode->next; //下一個節點的地址<br />free(tmp);<br />}<br />}</p><p>//銷毀棧<br />void Destroy(Stack* stack){<br />Clean(stack); //先清空棧,釋放記憶體<br />free(stack->top); //釋放<br />}</p><p>//壓棧<br />void Push(Stack* stack,Node* node){<br />/*<br />*說明:這裡可以有另一種更好的做法<br />* 分配一塊Node 大小的記憶體,然後將node中的資料複製到該記憶體處<br />* 本函數從簡,沒有採用這種做法<br />*/<br />node->next = stack->top->next; //入棧節點 next指向原棧第一個節點<br /> stack->top->next = node; //棧頂top指向該入棧節點<br />}</p><p>//彈棧<br />Node* Pop(Stack* stack){<br />Node* del= NULL;<br />del = stack->top->next;<br />if(del != NULL){ //非空<br />stack->top->next = del->next; //指向第二個節點(可能為NULL)<br />}<br />return del;<br />}</p><p>//棧長度<br />int Length(Stack* stack){<br />int i = 0;<br />Node* pNode;</p><p>pNode = stack->top->next; //指向棧的第一個節點<br />while(pNode != NULL){<br />i++;<br />pNode = pNode->next;<br />}<br />return i;<br />}</p><p>//顯示棧節點<br />void NodeDisplay(Node* node){<br />/*<br />*說明:當節點的資料類型不是int類型時<br />* 重寫該函數<br />*/<br />printf("value = %d/n",node->value);<br />}</p><p>//顯示棧<br />void StackDisplay(Stack* stack){<br />Node* pNode;<br />pNode = stack->top->next; //第一個事件<br />while(pNode != NULL){ //空表<br />NodeDisplay(pNode);<br />pNode = pNode->next;<br />}<br />}</p><p>//--------------------------主函數------------------------------------------------</p><p>void main(){<br />Stack* linkStack;<br />Node* node1,*node2,*node3,*node4,*node5;</p><p>node1 = (Node*)malloc(sizeof(Node));<br />node2 = (Node*)malloc(sizeof(Node));<br />node3 = (Node*)malloc(sizeof(Node));<br />node4 = (Node*)malloc(sizeof(Node));</p><p>linkStack = (Stack*)malloc(sizeof(Stack));</p><p>node1->value = 1;<br />node2->value = 2;<br />node3->value = 3;<br />node4->value = 4;</p><p>InitStack(linkStack);</p><p>Push(linkStack,node1);<br />printf("%d 壓棧,棧長度為%d/n",node1->value,Length(linkStack));<br />StackDisplay(linkStack);<br />printf("-----------------------------------/n");</p><p>Push(linkStack,node2);<br />printf("%d 壓棧,棧長度為%d/n",node2->value,Length(linkStack));<br />StackDisplay(linkStack);<br />printf("-----------------------------------/n");</p><p>node5 = Pop(linkStack);<br />printf("%d 彈棧,棧長度為%d/n",node5->value,Length(linkStack));<br />printf("",Length(linkStack));<br />StackDisplay(linkStack);<br />printf("-----------------------------------/n");</p><p>Push(linkStack,node3);<br />printf("%d 壓棧,棧長度為%d/n",node3->value,Length(linkStack));<br />StackDisplay(linkStack);<br />printf("-----------------------------------/n");</p><p>Push(linkStack,node4);<br />printf("%d 壓棧,棧長度為%d/n",node4->value,Length(linkStack));<br />StackDisplay(linkStack);<br />printf("-----------------------------------/n");<br />}