#include <stdio.h>#include <stdlib.h>//棧的鏈式存儲結構typedef char ElemType;typedef struct linknode{ ElemType data;//數據域 struct linknode *next;//指針域}LiStack;//初始化棧void InitStack(LiStack *&s){ s=(LiStack *)malloc(sizeof(LiStack)); s->next=NULL;}//銷毀棧void DestroyStack(LiStack *&s){ LiStack *p=s,*q=s->next; while(q!=NULL) { free(p); p=q; q=p->next; } free(p);}//判斷棧是夠為空bool StackEmpty(LiStack *s){ return (s->next==NULL);}//進棧void Push(LiStack *&s,ElemType e){ LiStack *p=s; p=(LiStack *)malloc(sizeof(LiStack));//新建元素p p->data=e; /************************/ p->next=s->next; s->next=p; /************************/}//出棧bool Pop(LiStack *&s,ElemType &e){ LiStack *p; if(s->next==NULL) return false; p=s->next; e=p->data; /************************/ s->next=p->next; free(p); /************************/}//取棧頂元素bool GetTop(LiStack *s,ElemType &e){ LiStack *p; if(s->next==NULL) return false; p=s->next; e=p->data; return true;}int main(){ ElemType e; LiStack *s; PRintf("棧s的基本運算如下:/n"); printf(" (1)初始化棧s/n"); InitStack(s); printf(" (2)棧為%s/n",(StackEmpty(s)?"空":"非空")); printf(" (3)依次進棧元素a,b,c,d,e/n"); Push(s,'a'); Push(s,'b'); Push(s,'c'); Push(s,'d'); Push(s,'e'); printf(" (4)棧為%s/n",(StackEmpty(s)?"空":"非空")); printf(" (5)出棧序列:"); while (!StackEmpty(s)) { Pop(s,e); printf("%c ",e); } printf("/n"); printf(" (6)棧為%s/n",(StackEmpty(s)?"空":"非空")); printf(" (7)釋放棧/n"); DestroyStack(s); return 0;}運行結果:
心得:
棧的鏈式存儲結構是沒有到棧頂的情況的,可以無限長。其實無論進棧出棧還是刪除棧元素,用到的操作都是單鏈表的基本操作,進棧就是頭插法,出棧就是刪除第一個元素。另外出棧和去棧頂元素時要注意判斷棧空的情況。
|
新聞熱點
疑難解答