如何轻松使用 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、黑客等等......