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);
}