C說話棧的表現與完成實例詳解。本站提示廣大學習愛好者:(C說話棧的表現與完成實例詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話棧的表現與完成實例詳解正文
1.根本概念:
C說話的棧是指限制僅在表尾停止拔出和刪除操作的線性表。
棧作為C說話中一種經常使用的數據構造,是一種只能在一端停止拔出和刪除操作的特別線性表。它依照先輩後出的准繩存儲數據,先輩入的數據被壓入棧底,最初的數據在棧頂,須要讀數據的時刻從棧頂開端彈出數據(最初一個數據被第一個讀出來)。棧具有記憶感化,對棧的拔出與刪除操作中,不須要轉變棧底指針。
棧是許可在統一端停止拔出和刪除操作的特別線性表。許可停止拔出和刪除操作的一端稱為棧頂(top),另外一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數為零時稱為空棧。拔出普通稱為進棧(PUSH),刪除則稱為退棧(POP)。棧也稱為落後先出表。
在盤算機體系中,棧則是一個具有以上屬性的靜態內存區域。法式可以將數據壓入棧中,也能夠將數據從棧頂彈出。在i386機械中,棧頂由稱為esp的存放器停止定位。壓棧的操作使得棧頂的地址減小,彈出的操作使得棧頂的地址增年夜。
棧在法式的運轉中有著無足輕重的感化。最主要的是棧保留了一個函數挪用時所須要的保護信息,這經常稱之為客棧幀或許運動記載。客棧幀普通包括以下幾方面的信息:
(1)函數的前往地址和參數
(2)暫時變量:包含函數的非靜態部分變量和編譯器主動生成的其他暫時變量
2.完成代碼:
#define STACK_INIT_SIZE 10 /* 存儲空間初始分派量 */ #define STACKINCREMENT 2 /* 存儲空間分派增量 */ typedef struct SqStack { SElemType *base; /* 在棧結構之前和燒毀以後,base的值為NULL */ SElemType *top; /* 棧頂指針 */ int stacksize; /* 以後已分派的存儲空間,以元素為單元 */ }SqStack; /* 次序棧 */ Status InitStack(SqStack *S) { /* 結構一個空棧S */ (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!(*S).base) exit(OVERFLOW); /* 存儲分派掉敗 */ (*S).top=(*S).base; (*S).stacksize=STACK_INIT_SIZE; return OK; } Status DestroyStack(SqStack *S) { /* 燒毀棧S,S不再存在 */ free((*S).base); (*S).base=NULL; (*S).top=NULL; (*S).stacksize=0; return OK; } Status ClearStack(SqStack *S) { /* 把S置為空棧 */ (*S).top=(*S).base; return OK; } Status StackEmpty(SqStack S) { /* 若棧S為空棧,則前往TRUE,不然前往FALSE */ if(S.top==S.base) return TRUE; else return FALSE; } int StackLength(SqStack S) { /* 前往S的元素個數,即棧的長度 */ return S.top-S.base; } Status GetTop(SqStack S,SElemType *e) { /* 若棧不空,則用e前往S的棧頂元素,並前往OK;不然前往ERROR */ if(S.top>S.base) { *e=*(S.top-1); return OK; } else return ERROR; } Status Push(SqStack *S,SElemType e) { /* 拔出元素e為新的棧頂元素 */ if((*S).top-(*S).base>=(*S).stacksize) /* 棧滿,追加存儲空間 */ { (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!(*S).base) exit(OVERFLOW); /* 存儲分派掉敗 */ (*S).top=(*S).base+(*S).stacksize; (*S).stacksize+=STACKINCREMENT; } *((*S).top)++=e; return OK; } Status Pop(SqStack *S,SElemType *e) { /* 若棧不空,則刪除S的棧頂元素,用e前往其值,並前往OK;不然前往ERROR */ if((*S).top==(*S).base) return ERROR; *e=*--(*S).top; return OK; } Status StackTraverse(SqStack S,Status(*visit)(SElemType)) { /* 從棧底到棧頂順次對棧中每一個元素挪用函數visit()。 */ /* 一旦visit()掉敗,則操作掉敗 */ while(S.top>S.base) visit(*S.base++); printf("\n"); return OK; } #include"c1.h" typedef int SElemType; /* 界說棧元素類型,此句要在c3-1.h的後面 */ #include"c3-1.h" #include"bo3-1.c" Status visit(SElemType c) { printf("%d ",c); return OK; } void main() { int j; SqStack s; SElemType e; if(InitStack(&s)==OK) for(j=1;j<=12;j++) Push(&s,j); printf("棧中元素順次為:"); StackTraverse(s,visit); Pop(&s,&e); printf("彈出的棧頂元素 e=%d\n",e); printf("棧空否:%d(1:空 0:否)\n",StackEmpty(s)); GetTop(s,&e); printf("棧頂元素 e=%d 棧的長度為%d\n",e,StackLength(s)); ClearStack(&s); printf("清空棧後,棧空否:%d(1:空 0:否)\n",StackEmpty(s)); DestroyStack(&s); printf("燒毀棧後,s.top=%u s.base=%u s.stacksize=%d\n",s.top,s.base, s.stacksize); }