C語言實現順序棧心得

來源:互聯網
上載者:User

標籤:

棧的構成及初始化

對於“先進後出”的順序棧,需要控制3個量:棧元素,棧頂指標,棧容量。

棧容量即棧的最大容量,若超過會產生溢出錯誤。當然,必要時也可以擴充容量。

棧元素可以通過動態數組( base[] )存放。初始化時用 malloc 申請(棧容量 * 元素類型)個空間。

棧頂指標用於記錄棧元素個數,始終指向棧頂元素的上一個單位(如 棧頂元素為base[3],棧頂指標為4),這樣就能實現元素個數的記錄。不過,棧頂指標只是一種形象化的叫法,方便起見,一般將其定義為 int 型。初始化時,棧頂指標置0。

 

定義結構體

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

 

壓棧

壓棧就是讓元素進棧,棧頂指標 top 加一,元素存入數組 base[] 。如果已經棧滿,可以增加記憶體空間(實際上是重新分配空間),此時棧容量 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;

}

 

取棧頂元素

取頂只用把棧頂元素的值記錄下來,而不需要讓其出棧。可以用指標來取值。同樣,用傳回值判斷是否取頂成功。

 

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

 

求棧長

取出 top 的值即可

 

int getlen(ZAN* s)
{
    return s->top;
}

 

判斷棧是否為空白

看 top 是否為0即可

 

int isempty(ZAN* s)
{
    if(!s->top) return 0;
    else return 1;
}

 

輸出棧元素

將 base[] 自頂向下輸出即可,不對棧進行任何操作。

 

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("");

}

 

測試功能

 

// 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
}

C語言實現順序棧心得

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.