日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C语言实现顺序栈心得

發(fā)布時(shí)間:2024/4/17 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言实现顺序栈心得 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

棧的構(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。