文章插图
作者 | 写代码的篮球球痴
1.什么是数据结构?
数据结构是什么?要了解数据结构,我们要先明白数据和结构,数据就是一些int char 这样的变量,这些就是数据,如果你是一个篮球爱好者,那么你的球鞋就是你的数据,结构就是怎么把这些数据排列组合,怎么把数据摆放好才能方便你找到这些数据,把数据和结构合在一起理解就是所谓的数据结构,简单点,就是处理数据的方式方法 。
平时在家里面,你有没有随便摆放自己的鞋子,然后要找鞋子的时候要花费非常多是时间,可能你老婆也很生气,每天都乱摆鞋子导致她打扫卫生非常麻烦,然后有一天,你买了一个非常酷的鞋架,有了这个鞋架之后,你的鞋子终于有家了,这个鞋架就是起到处理鞋子的作用了 。
文章插图
2.什么是栈?栈可以理解为数据结构中的一种,这种数据结构的特点是先进去的人「数据」后出来,就像下面的图片一样,如果栈是一个洞,人「数据」只能从洞的一个口进去,然后出来也只能从一个口出来,而且洞的宽度就只能容纳一个人「数据」,好了,那先进去的那个人「数据」最傻逼了,一定要等后面进来的人「数据」都先出去了才能出去 。
文章插图
文章插图
文章插图
用%20C%20语言实现一个栈
我写代码是很水的,之前有一个同学写了一个栈让我检查,我看了下,好像我写代码的能力比他厉害一些,代码比较简单,然后讲一下几个比较重要的函数,希望大家在面试的时候,随手就甩出一个栈“砸死”面试官,哈哈 。
#include%20"stdio.h"#include%20"stdlib.h"struct%20List{int%20data;struct%20List%20*%20next;};struct%20Stack{struct%20List%20*head;int%20size;};struct%20Stack%20*%20StackInit(void){struct%20Stack%20*stack%20=%20;stack%20=%20(struct%20Stack*)malloc(sizeof(struct%20Stack));stack->head%20=%20(struct%20List%20*)malloc(sizeof(struct%20List));stack->head->next%20=%20;stack->size%20=%200;return%20stack;}int%20StackPush(struct%20Stack%20*stack,int%20data){struct%20List%20*tmp%20=%20(struct%20List%20*)malloc(sizeof(struct%20List));tmp->data%20=%20data;tmp->next%20=%20stack->head->next;stack->head->next%20=%20tmp;stack->size++;//printf("push:%d%20n",data);return%200;}int%20IsStackEmpty(struct%20Stack%20*stack){/*如果头指针指向下一个为空,说明栈为空*/if(stack->head->next%20==%20)return%201;elsereturn%200;}int%20StackPop(struct%20Stack%20*stack,int%20*data){struct%20List%20*tmp%20=%20;if(IsStackEmpty(stack))return%20-1;tmp%20=%20stack->head->next;*data%20=%20tmp->data;stack->head->next%20=%20tmp->next;stack->size--;free(tmp);//printf("pop:%d%20n",*data);return%200;}int%20main(void){int%20i%20=%200;struct%20Stack%20*stack%20=%20;stack%20=%20StackInit;for(i%20=%200;i<5;i++){StackPush(stack,i);}for(i%20=%200;i<5;i++){int%20data%20=%200;StackPop(stack,&data);printf("%d%20",data);}printf("n");return%200;}
1-栈头部栈头部,也就是栈顶指针,我们用指针单链表实现一个栈,一定要知道这个栈顶的指针,有头就有栈,没有头,这个栈也就跨了 。
struct%20Stack%20*stack%20=%20;stack%20=%20StackInit;
这个就是定义一个栈,也就是malloc出来一个内存,专门存这个栈顶的 。文章插图
2-出栈
出栈的方法跟我之前说的差不多,只不过出栈代码上需要做判断 。
int StackPop(struct Stack *stack,int *data){struct List *tmp = ;if(IsStackEmpty(stack))return -1;tmp = stack->head->next;*data = https://www.isolves.com/it/cxkf/yy/C/2019-11-04/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-入栈
入栈的操作和出栈的操作刚好相反,就是改变一下位置和指针的指向 。
推荐阅读
- 如何在记事本中制作关机程序
- 手把手教你使用阿里云服务器搭建网站全过程(图文教程)
- html meta标签使用及属性的详细分析
- SEM干货:如何确定哪些是恶意点击?
- 如何使用Docker部署MongoDB副本集
- Android代码中是如何下毒的
- 浏览器是如何解析JavaScript的?
- x86与x64的区别?云服务器如何选择操作系统?
- 交换机权限管理混乱,可操作交换机人员少,如何破局?
- 春茶,如何正确且健康的品饮