如何輕鬆使用 C 語言實現一個棧?

什麼是數據結構?

        數據結構是什麼?要了解數據結構,咱們要先明白數據和結構,數據就是一些int char 這樣的變量,這些就是數據,若是你是一個籃球愛好者,那麼你的球鞋就是你的數據,結構就是怎麼把這些數據排列組合,怎麼把數據擺放好才能方便你找到這些數據,把數據和結構合在一塊兒理解就是所謂的數據結構,簡單點,就是處理數據的方式方法。面試

        平時在家裏面,你有沒有隨便擺放本身的鞋子,而後要找鞋子的時候要花費很是可能是時間,可能你老婆也很生氣,天天都亂擺鞋子致使她打掃衛生很是麻煩,而後有一天,你買了一個很是酷的鞋架,有了這個鞋架以後,你的鞋子終於有家了,這個鞋架就是起處處理鞋子的做用了。編程


 

什麼是棧?

        棧能夠理解爲數據結構中的一種,這種數據結構的特色是先進去的人「數據」後出來,就像下面的圖片同樣,若是棧是一個洞,人「數據」只能從洞的一個口進去,而後出來也只能從一個口出來,並且洞的寬度就只能容納一我的「數據」,好了,那先進去的那我的「數據」最傻逼了,必定要等後面進來的人「數據」都先出去了才能出去。windows


 

 

用 C 語言實現一個棧

 我寫代碼是很水的,以前有一個同窗寫了一個棧讓我檢查,我看了下,好像我寫代碼的能力比他厲害一些,代碼比較簡單,而後講一下幾個比較重要的函數,但願你們在面試的時候,隨手就甩出一個棧「砸死」面試官,哈哈。
#include "stdio.h"

#include "stdlib.h"

struct List{

    int data;

    struct List * next;

};

struct Stack{

    struct List *head;

    int size;

};

struct Stack * StackInit(void)

{

    struct Stack *stack = NULL;

    stack =  (struct Stack*)malloc(sizeof(struct Stack));

    stack->head = (struct List *)malloc(sizeof(struct List));

    stack->head->next = NULL;

    stack->size = 0;

    return stack;

}

int StackPush(struct Stack *stack,int data)

{

    struct List *tmp = (struct List *)malloc(sizeof(struct List));

    tmp->data = data;

    tmp->next = stack->head->next;

    stack->head->next = tmp;

    stack->size++;

    //printf("push:%d \n",data);

    return 0;

}

int IsStackEmpty(struct Stack *stack)

{

    /*若是頭指針指向下一個爲空,說明棧爲空*/

    if(stack->head->next == NULL)

        return 1;

    else

        return 0;

}

int StackPop(struct Stack *stack,int *data)

{

    struct List *tmp = NULL;

    if(IsStackEmpty(stack))

        return -1;

    tmp = stack->head->next;

    *data = tmp->data;

    stack->head->next = tmp->next;

    stack->size--;

    free(tmp);

    //printf("pop:%d \n",*data);

    return 0;

}

int main(void)

{

    int i = 0;

    struct Stack *stack = NULL;

    stack = StackInit();

    for(i = 0;i<5;i++)

    {

        StackPush(stack,i);

    }

    for(i = 0;i<5;i++)

    {

        int data = 0;

        StackPop(stack,&data);

        printf("%d ",data);

    }

    printf("\n");

    return 0;

}

 

 

1- 棧頭部

        棧頭部,也就是棧頂指針,咱們用指針單鏈表實現一個棧,必定要知道這個棧頂的指針,有頭就有棧,沒有頭,這個棧也就跨了。數組

struct Stack *stack = NULL;

    stack = StackInit();

 

        這個就是定義一個棧,也就是malloc出來一個內存,專門存這個棧頂的。數據結構


 

 

2- 出棧

        出棧的方法跟我以前說的差很少,只不過出棧代碼上須要作判斷。函數

int StackPop(struct Stack *stack,int *data)

{

    struct List *tmp = NULL;

    if(IsStackEmpty(stack))

        return -1;

    tmp = stack->head->next;

    *data = tmp->data;

    stack->head->next = tmp->next;

    stack->size--;

    free(tmp);

    //printf("pop:%d \n",*data);

    return 0;

}

 

        先判斷這個棧是否是空的,是否是空的判斷方法就是經過判斷head->next的指針是否爲空。學習

        而後把head->next 這個位置的數據取出來,取出來後,再把head->next的指針指向 取出來這個位置 的next 位置。spa

        而後再記得free掉。就Ok了。指針


 

3- 入棧

        入棧的操做和出棧的操做恰好相反,就是改變一下位置和指針的指向。code

int StackPush(struct Stack *stack,int data)

{

    struct List *tmp = (struct List *)malloc(sizeof(struct List));

    tmp->data = data;

    tmp->next = stack->head->next;

    stack->head->next = tmp;

    stack->size++;

    //printf("push:%d \n",data);

    return 0;

}

 

 

用數組來實現一個棧

        數組自己是一種數據結構,使用數組實現一個棧也是很是簡單方便的,你們請看。

#include "stdio.h"

#include "stdlib.h"

/*棧的大小*/

#define LENGHT (100)

struct Stack{

    int stack_array[LENGHT];

    unsigned int size;//棧動態長度

};

struct Stack * StackInit(void)

{

    struct Stack *stack = NULL;

    stack =  (struct Stack*)malloc(sizeof(struct Stack));

    stack->size = 0;

    return stack;

}

int StackPush(struct Stack *stack,int data)

{

    if(stack->size >= LENGHT)

    {

        printf("stack is full\n");

        return (-1);

    }

    stack->stack_array[stack->size] = data;

    stack->size++;

    //printf("push:%d size:%d\n",data,stack->size);

    return 0;

}

int IsStackEmpty(struct Stack *stack)

{

    /*若是頭指針指向下一個爲空,說明棧爲空*/

    if(stack->size == 0)

        return 1;

    else

        return 0;

}

int StackPop(struct Stack *stack,int *data)

{

    stack->size--;

    if(IsStackEmpty(stack))

        return -1;

    *data = stack->stack_array[stack->size];

    //printf("pop:%d size:%d\n",*data,stack->size);

    return 0;

}

int main(void)

{

    int i = 0;

    struct Stack *stack = NULL;

    stack = StackInit();

    for(i = 0;i<20;i++)

    {

        StackPush(stack,i);

    }

    for(i = 0;i<21;i++)

    {

        int data = 0;

        StackPop(stack,&data);

        printf("%d \n",data);

    }

    printf("\n");

    return 0;

}

 

 

 

總結

        既然有棧,就會有和棧不同的數據結構,有一種數據結構叫作隊列,棧的數據結構特色是先進後出,隊列的數據結構特色是先進先出,有點意思,棧和隊列作驅動的同窗不多須要本身寫代碼實現,正常狀況下都是SDK集成了方法,直接調用接口就行了,可是寫應用的同窗,常常要本身實現一個棧或者隊列,特別是大企業面試,這些算是很是基礎的題目,最好是閉着眼睛就能寫出來的那種。


 

若是你想快速掌握C/C++編程,小編推薦個人C語言/C++編程學習基地【點擊進入】!


 

都是學編程小夥伴們,帶你入個門仍是簡簡單單啦,一塊兒學習,一塊兒加油~

涉及:編程入門、遊戲編程、windows編程、Linux編程、Qt、黑客等等......

相關文章
相關標籤/搜索