壓棧出棧遍曆棧執行個體代碼,執行個體代碼
#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef struct Node//定義一個鏈表結構體{int data;struct Node* pNext;}NODE,*PNODE;typedef struct Stack//定義一個棧結構體{PNODE pTop;PNODE pBottom;}STACK,*PSTACK;void initStack(PSTACK);void pushStack(PSTACK,int);void travelStack(PSTACK);bool popStack(PSTACK,int*);void clear(PSTACK ps);int main(){int val;STACK S;//定義一個S變數,該變數有兩個參數。一個pTop,一個pBottoninitStack(&S);//初始化棧pushStack(&S,1);//壓棧pushStack(&S,2);pushStack(&S,3);pushStack(&S,4);pushStack(&S,5);travelStack(&S);//遍曆輸出if(popStack(&S,&val))//判斷是否出棧成功{printf("出棧成功,出棧元素是%d\n",val);}else{printf("出棧失敗\n");}printf("出棧後遍曆輸出結果\n");travelStack(&S);//遍曆輸出clear(&S);printf("再次遍曆下面為空白,說明清空成功!\n");travelStack(&S);//遍曆輸出return 0;}void initStack(PSTACK ps)//初始化棧,讓棧裡面的兩個元素指向一個節點。{ps->pTop=(PNODE)malloc(sizeof(NODE));if(NULL==ps->pTop){printf("動態記憶體分配失敗\n");exit(-1);}else{ps->pBottom=ps->pTop;ps->pTop->pNext=NULL;//等價於:ps->pBottom->pNext=NULL;也就是說下一次插入的空間是空的。也就是棧頂元素下一個是空的}}void pushStack(PSTACK ps,int val)//壓棧函數{PNODE pNew=(PNODE)malloc(sizeof(NODE));pNew->data=val;pNew->pNext=ps->pTop;//每次都把元素壓到棧頂ps->pTop=pNew;}void travelStack(PSTACK ps)//遍曆棧{PNODE p=ps->pTop;while(p!=ps->pBottom){printf("%d ",p->data);p=p->pNext;}printf("\n");return ;}bool empty(PSTACK ps)//判斷棧是否為空白{if(ps->pTop==ps->pBottom)return true;elsereturn false;}//把ps所指向的棧出棧一次,並把出棧的元素存入pVal形參所指向的變數中//如果出棧失敗,返回false,否則,返回truebool popStack(PSTACK ps,int* pVal){if(empty(ps)){return false;}else{PNODE r=ps->pTop;*pVal=r->data;ps->pTop=r->pNext;free(r);r=NULL;return true;}}//最後把棧清空。void clear(PSTACK ps){if(empty(ps)){return ;}else{PNODE p=ps->pTop;PNODE q=NULL;while(p!=ps->pBottom){q=p->pNext;free(p);p=q;}ps->pTop=ps->pBottom;}}