作者 | 写代码的篮球球痴

什么是数据结构?

数据结构是什么?要了解数据结构,我们要先明白数据和结构,数据就是一些int char 这样的变量,这些就是数据,如果你是一个篮球爱好者,那么你的球鞋就是你的数据,结构就是怎么把这些数据排列组合,怎么把数据摆放好才能方便你找到这些数据,把数据和结构合在一起理解就是所谓的数据结构,简单点,就是处理数据的方式方法。

平时在家里面,你有没有随便摆放自己的鞋子,然后要找鞋子的时候要花费非常多是时间,可能你老婆也很生气,每天都乱摆鞋子导致她打扫卫生非常麻烦,然后有一天,你买了一个非常酷的鞋架,有了这个鞋架之后,你的鞋子终于有家了,这个鞋架就是起到处理鞋子的作用了。

什么是栈?

栈可以理解为数据结构中的一种,这种数据结构的特点是先进去的人「数据」后出来,就像下面的图片一样,如果栈是一个洞,人「数据」只能从洞的一个口进去,然后出来也只能从一个口出来,而且洞的宽度就只能容纳一个人「数据」,好了,那先进去的那个人「数据」最傻逼了,一定要等后面进来的人「数据」都先出去了才能出去。

用 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;elsereturn 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 位置。

然后再记得free掉。就Ok了。

3-入栈

入栈的操作和出栈的操作刚好相反,就是改变一下位置和指针的指向。

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;elsereturn 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集成了方法,直接调用接口就好了,但是写应用的同学,经常要自己实现一个栈或者队列,特别是大企业面试,这些算是非常基础的题目,最好是闭着眼睛就能写出来的那种。

【End】

为什么我要在2019年学习Python?

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

 热 文 推 荐 

如何轻松使用 C 语言实现一个栈?​相关推荐

  1. c语言编写一个菜单系统_一招教你,轻松解决C语言编写一个正整数的所有因子!...

    这个实例是一个能提高分析能力的实例,这个实例主要用到for语句,关键是如何确定其中变量的范围. 求一个正整数的所有因子 先来看看编程结果演示: 编程演示 输出结果 编程如下: #include /*引 ...

  2. c语言判断一个点在长方体内部_21个入门练手项目,让你轻松玩转C语言

    C 语言作为大学理工科专业的必修,是很多同学走进编程世界的第一课.那么怎样才能更好的入门 C 语言呢? 下面整理了 21 个 C 语言练手项目,从基础语法开始,逐步深入,通过一个个练手项目,让你轻松驰 ...

  3. 栈中pop和top的区别是什么呢?用队列实现一个栈,Python语言

    区别: pop是弹出栈顶元素,top是获得栈顶元素,不弹出  pop弹出后可以获取,把弹出的东西付给某个变量 具体可以通过用队列实现一个栈来分析原因. #用队列实现栈 class Stack:&quo ...

  4. java语言数组实现栈的操作_基于自定义的动态数组实现一个栈(Java语言)

    1.什么是栈? (1)只能从一端添加元素,也只能从一端取出元素,这一端称为栈顶. (2)栈是一种后进先出的数据结构 画个图: 2.栈的实现 (1)定义一个栈的接口 接口是类的行为的抽象. 以下行为分别 ...

  5. 【c语言】两个队列实现一个栈

    两个队列实现一个栈 核心思想:模拟出栈的后进先出操作 创建queue1和queue2,入栈时选择一个非空队列执行入队列操作(若两个队列都为空,则随机选择一个队列),出栈时需要先从非空队列queue1把 ...

  6. C语言:一个涉及指针函数返回值与printf乱码、内存堆栈的经典案例

    C语言:一个涉及指针函数返回值与printf乱码.内存堆栈的经典案例 一个奇怪的C语言问题,涉及到指针.数组.堆栈.以及printf.以下实现: 整数向字符串的转换,返回字符串指针,并在main函数中 ...

  7. c语言数组在栈上的分配,彻底弄懂为什么不能把栈上分配的数组(字符串)作为返回值...

    背景 最近准备从 C 语言零基础到 PHP 扩展开发实战,案例的过程中准备了如下代码碎片,演示解析http scheme #include #include #include char *parse_ ...

  8. 怎样学好C语言,一个成功人士的心得!

    今天,我能够自称是一个混IT的人,并能以此谋生,将来大家能一次谋生,都要感谢两个人:克劳德.香农和约翰.冯.诺依曼,是他们发现了全部的数字化信息,不论是一段程序,一封email,一部电影都是用一连串的 ...

  9. c语言受到哪些编程的影响,C语言,一个影响了整个世界的编程语言!

    Dennis Ritchie 过世了,他发明了C语言,一个影响深远并彻底改变世界的计算机语言.一门经历40多年的到今天还长盛不衰的语言,今天很多语言都受到C的影响,C++,Java,C#,Perl, ...

最新文章

  1. Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决
  2. Chrome报错:Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.
  3. Markdown 图标 快捷键
  4. 沉思滥用:“强力使用,破坏滥用”
  5. 开放才能进步!Angular和Wijmo一起走过的日子
  6. 第一次更名为OpenInfra的“她”,给我们带来了哪些惊喜?| 技术头条
  7. Java递归例子——求x的y幂次方
  8. 解决libstdc++.so.6: version `GLIBCXX_3.4.22' not found
  9. python常用代码入门-最全Python算法实现资源汇总!
  10. python软件下载安装百度网盘-Python自动化测试视频教程【百度云盘下载】
  11. VM两个虚拟机之间的通讯测试
  12. 设置Easyui datagrid的pageNumber导致两次请求的解决方案
  13. pubwin扫描安装
  14. 情报研判分析系统开发,可视化大数据研判平台建设
  15. Windows 常用dos命令大全
  16. awk 分隔符_awk 命令快速入门
  17. 20211212做实验时的感想
  18. python发邮件详解 -- smtplib和email模块
  19. velocity制作pdf
  20. net use命令的密码问题

热门文章

  1. 5 questions
  2. java 2和java有什么区别
  3. 关于Java中的GUI事件处理
  4. 结构体,文件操作,指针,简单练习
  5. 常用正则表达式 潇湘博客
  6. Windows下安装Semantic-Segmentation-Editor标注软件
  7. PIL保存二维numpy数组(2,2)为灰度图和RGB图
  8. Linux下TCP循环接收数据的方式
  9. vim设置Tab为空格
  10. 中国庭院刮板市场趋势报告、技术动态创新及市场预测