棧—鏈式儲存實現

來源:互聯網
上載者:User

一、說明

     棧的操作比較簡單

    儲存一個棧頂 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 />}

   

     

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.