C语言实现顺序栈心得
棧的構(gòu)成及初始化
對(duì)于“先進(jìn)后出”的順序棧,需要控制3個(gè)量:棧元素,棧頂指針,棧容量。
棧容量即棧的最大容量,若超過(guò)會(huì)產(chǎn)生溢出錯(cuò)誤。當(dāng)然,必要時(shí)也可以擴(kuò)充容量。
棧元素可以通過(guò)動(dòng)態(tài)數(shù)組( base[] )存放。初始化時(shí)用 malloc 申請(qǐng)(棧容量 * 元素類型)個(gè)空間。
棧頂指針用于記錄棧元素個(gè)數(shù),始終指向棧頂元素的上一個(gè)單位(如 棧頂元素為base[3],棧頂指針為4),這樣就能實(shí)現(xiàn)元素個(gè)數(shù)的記錄。不過(guò),棧頂指針只是一種形象化的叫法,方便起見,一般將其定義為 int 型。初始化時(shí),棧頂指針置0。
?
定義結(jié)構(gòu)體
struct sta
{
??? int top;
??? int *base;
??? int size;
};
typedef struct sta ZAN;
?
棧的建立(分配空間)
ZAN* create()
{
??? ZAN *p;
??? p=(ZAN *)malloc(sizeof(ZAN));
??? return p;
}
?
棧的初始化
void zer(ZAN *s)
{
??? s->top=0;
??? s->size=INI; //#define?INI 10
??? s->base=(int *)malloc(INI*sizeof(int));
}
?
壓棧
壓棧就是讓元素進(jìn)棧,棧頂指針 top 加一,元素存入數(shù)組 base[] 。如果已經(jīng)棧滿,可以增加內(nèi)存空間(實(shí)際上是重新分配空間),此時(shí)棧容量 size 也要加一。用返回值判斷是否壓棧成功。
?
int push(ZAN *s,int x)
{
??? if( (s->top) >= (s->size) )
??? {
??????? s->base=(int *)realloc(s->base,(s->size+1)*sizeof(int));
??????? if(!s->size) return 0;
??????? s->size++;
??? }
??? s->top++;
??? s->base[s->top-1]=x;
??? return 1;
}
?
取棧頂元素
取頂只用把棧頂元素的值記錄下來(lái),而不需要讓其出棧。可以用指針來(lái)取值。同樣,用返回值判斷是否取頂成功。
?
int gettop(ZAN *s,int *e)
{
??? if(s->top==0) return 0;
??? else
??? {
??????? *e=s->base[(s->top)-1];
??????? return 1;
??? }
}
?
彈棧
彈棧是取出其值,并讓棧頂元素出棧,top減一。同樣,用指針記錄其值,用返回值判斷是否彈棧成功。
?
int pop(ZAN *s,int* e)
{
??? if(!s->top) return 0;
??? else
??? {
??????? *e=s->base[(s->top)-1];
??????? s->top--;
??????? return 1;
??? }
}
?
求棧長(zhǎng)
取出 top 的值即可
?
int getlen(ZAN* s)
{
??? return s->top;
}
?
判斷棧是否為空
看 top 是否為0即可
?
int isempty(ZAN* s)
{
??? if(!s->top) return 0;
??? else return 1;
}
?
輸出棧元素
將 base[] 自頂向下輸出即可,不對(duì)棧進(jìn)行任何操作。
?
void list(ZAN* s)
{
int i;
?
puts("\n list ZAN:");
for(i=s->top-1;i>=0;i--)
{
if(i!=s->top-1) printf("\n"); //此處可以用空格代替換行
printf("%d",s->base[i]);
}
puts("");
}
?
測(cè)試功能
?
// TEST FUNCTION
main()
{
??? ZAN *create();
??? void zer(ZAN *s);
??? int push(ZAN *s,int x);
??? int gettop(ZAN *s,int *e);
??? int getlen(ZAN* s);
??? int isempty(ZAN* s);
??? void list(ZAN* s);
??? ZAN *s;
??? int n,*e,i=1;
??? i=1;e=&i;?????????????????????????????????????????????????????????? // protect
??? s=create();???????????????????????????????????????????????????????? // create a stack
??? zer(s);???????????????????????????????????????????????????????????? // initialize
??? if(!isempty(s)) puts("ZAN is empty\n");?????????????????????????????? // empty?
??? else puts("ZAN is not not empty\n");
??? puts(" push int x:"); // push an element in
??? scanf("%d",&n);
??? if(push(s,n)) ;
??? else printf(" push %d error\n",n);
??? if(gettop(s,e)) printf("gettop %d\n",*e);????????????????????? // get top element
??? else puts("gettop error");
??? printf("\n push int x:\n");
??? scanf("%d",&n);
??? if(push(s,n)) ;??????????????????????????????????????????? // push an element in
??? else printf("push %d error\n",n);
??? if(gettop(s,e)) printf("gettop %d\n",*e);????????????????????? // get top element
??? else puts("gettop error");
??? if(pop(s,e)) printf("pop %d\n",*e); //pop top element
??? else printf("pop %d error\n",n);
??? if(gettop(s,e)) printf("gettop %d\n",*e);????????????????????? // get top element
??? else puts("gettop error");
??? if(!isempty(s)) puts("ZAN is empty\n");?????????????????????????????? // empty?
??? else puts("ZAN is not not empty\n");
??? if(isempty(s)) list(s);
??? printf("\n push int x:\n");
??? scanf("%d",&n);
??? if(push(s,n)) ;??????????????????????????????????????????? // push an element in
??? else printf("push %d error\n",n);
??? if(isempty(s)) list(s); //output ZAN
}
轉(zhuǎn)載于:https://www.cnblogs.com/GY8023/p/4525479.html
總結(jié)
以上是生活随笔為你收集整理的C语言实现顺序栈心得的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【sqlite权威指南】笔记3 sqli
- 下一篇: 深入剖析js命名空间函数namespac