栈,C语言实现

什么是数据结构?

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

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

640?wx_fmt=png

什么是栈?

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

640?wx_fmt=png
640?wx_fmt=png

用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出来一个内存,专门存这个栈顶的。

640?wx_fmt=png

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了。

640?wx_fmt=png

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

640?wx_fmt=png

640?wx_fmt=jpeg

扫码或长按关注

回复「 加群 」进入技术群聊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Camera摄像头工作原理

回想这工作的这几年&#xff0c;尝尽社会的辛酸艰难&#xff0c;从一开始什么都没有到30万&#xff0c;从30万到200万&#xff0c;从200万到1300万&#xff0c;不是炫耀&#xff0c;我只是想通过我自己的经历告诉我的朋友们「手机像素越高&#xff0c;拍的照片越清晰」摄像头结…

es6一维数组转二维数组_技术图文:Numpy 一维数组 VS. Pandas Series

背景Numpy 提供的最重要的数据结构是 ndarray&#xff0c;它是 Python 中 list 的扩展。Pandas 提供了两种非常重要的数据结构 Series和DataFrame。Numpy 中的一维数组与 Series 相似&#xff0c;一维数组只是提供了从0开始与位置有关的索引&#xff0c;而Series除了位置索引之…

unity UI事件

由于工作需要到持续按键&#xff0c;所以了解了一下unity UI事件&#xff0c;本文主要转载于http://www.cnblogs.com/zou90512/p/3995932.html?utm_sourcetuicool&utm_mediumreferral&#xff0c;并对相关问题进行解释。 我们最常用到的就是unity的button组件&#xff0c;…

电子工程学院的师兄弟姐们们,老师叫你们回家

昨天写了很长的文章&#xff0c;接收到推送的同学们应该也会很开心&#xff0c;但是由于我的原因&#xff0c;需要把文章删除「你们能想到的原因肯定不是我删文的原因」&#xff0c;但是呢&#xff0c;也因为这样&#xff0c;又可以重写一篇&#xff0c;刚好可以多加点内容。后…

auto.js停止所有线程_Java多线程编程基础知识 概念介绍,以及线程状态

一、进程进程是操作系统结构的基础&#xff1b;是一次程序的执行&#xff1b;是一个程序及其数据在处理机上顺序执行时所发生的活动。操作系统中&#xff0c;几乎所有运行中的任务对应一条进程(Process)。一个程序进入内存运行&#xff0c;即变成一个进程。进程是处于运行过程中…

Linux 进程管理数据结构

文末集赞留言抽奖&#xff0c;我会选出留言点赞数前 3 名送出小米耳机。别刷赞啊&#xff0c;刷赞被举报无效&#xff0c;相信真的是公众号粉丝的读者&#xff0c;不会做这样的行为&#xff0c;刷赞指的是购买外挂刷&#xff0c;如果是转发到朋友圈和微信群的&#xff0c;不算刷…

如何安装python3.8_python3.8下载及安装步骤详解

1.操作系统&#xff1a;Windows7 64bit executable installer 2.安装步骤&#xff1a; 双击安装文件python-3.8.0-amd64.exe 勾选下方“Add Python 3.8 to PATH”&#xff0c;并选择“Customize installation”3.把Optional Features全部勾选上&#xff0c;点击“Next"4.A…

队列,C语言实现

什么是队列&#xff1f;上一篇文章写了什么是栈&#xff0c;用C语言实现了栈&#xff0c;既然说了栈&#xff0c;不说队列&#xff0c;感觉总是少了点什么&#xff0c;所以就顺手写一个队列&#xff0c;而且最近做项目也用到这个队列的代码。栈的特点是先进后出&#xff0c;队列…

华为hr,我尽力了

最近&#xff0c;一则新闻很火但是突然&#xff0c;又不火了&#xff0c;火于不火之间&#xff0c;时间有点短&#xff0c;其中猜测很大部分是gongguan原因以下为正文截图~以上为事件原文&#xff0c;这个是一个热点新闻&#xff0c;之前发了一个热点新闻&#xff0c;瞬间就火爆…

idea,eclipse创建多模块项目

新建一个maven项目 iead,新建是不选择archetype,新建好之后,pom中的 <packaging>pom</packaging>节点是默认的,如果不是要改成这这样子 然后选中这个项目,新建一个module,之后就和建立普通项目一样了. eclipse 是这样的 建一个普通的maven项目就可以了 这个是建好之…

python画图程序代码_少儿python编程(7)海龟画图(拓展1)

我们继续用Python的海龟库来画图吧&#xff01;上图是画一朵花的程序&#xff0c;重点是6-12行&#xff0c;使用了函数来定义drawleaf:每一掰叶子由两条弧线组成&#xff0c;每一条弧线重复画15次&#xff0c;每次前进5步&#xff0c;右转6度。看图形化代码就很清楚了&#xff…

opencv matlab三维点云,点云采样的三种方法 - 小白学视觉的个人空间 - OSCHINA - 中文开源技术交流社区...

点击上方“小白学视觉”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达编辑&#xff1a;3D视觉工坊本文由知乎作者GeometryHub授权转载&#xff0c;不得擅自二次转载。原文链接&#xff1a;https://zhuanlan.zhihu.com/p/86044055点云采样分类点云采样的方法…

C语言数组越界导致无限循环

大奖也是你们的&#xff0c;感谢支持&#xff0c;不喜欢的请轻拍。过年抽奖我还是很期待的&#xff0c;每年公司的年会抽奖的时候&#xff0c;我总是能小中一把&#xff0c;有一年我还中了个一等奖&#xff0c;不知道大家对一等奖什么概念&#xff0c;中一等奖的概率非常低&…

七月流水账

7.1-7.3 >< 7.4 看了一会儿李老大给的Caffe的教程 重配python qt vtk&#xff0c;大概是原来装了一个xxx&#xff08;忘记名字&#xff09;&#xff0c;然后位数有些不对&#xff0c;搞了好一阵 果然还是卸载重装好>< 然后又看了会儿Matlab神经网络工具箱怎么用 …

python绘制拟合回归散点图_机器学习之利用Python进行简单线性回归分析

前言&#xff1a;在利用机器学习方法进行数据分析时经常要了解变量的相关性&#xff0c;有时还需要对变量进行回归分析。本文首先对人工智能/机器学习/深度学习、相关分析/因果分析/回归分析等易混淆的概念进行区分&#xff0c;最后结合案例介绍如何利用Python进行简单线性回归…

十年经验教你如何学习嵌入式系统

一、如何学习嵌入式系统- - 嵌入式系统的概念着重理解“嵌入”的概念 &#xff0c;主要从三个方面上来理解。1、从硬件上&#xff0c;“嵌入”将基于CPU的处围器件&#xff0c;整合到CPU芯片内部&#xff0c;比如早期基于X86体系结构下的计算机&#xff0c;CPU只是有运算器和累…

php博客文章修改,wordpress博客如何快速修改文章阅读数

WordPress修改文章阅读次数可以通过插件来完成&#xff0c;下面我们以WP-PostViews插件演示如何修改文章阅读次数。WP-PostViews是一个非常常用的wordpress插件&#xff0c;主要用于文章阅读数访问量的统计&#xff0c;插件使用简单&#xff0c;直接安装启用即可&#xff0c;并…

ionic拍照,从相册选择功能

在介绍插件的使用之前&#xff0c;我们有必要先大致了解下插件的原理 一、插件工作原理分析 一个插件是如何正确地在IONIC框架下运行的呢? 前台的HTML/js代码又是如何与后面具体平台做数据交互的呢? 这个就需要对插件的工作原理及各个模块之间的流程关系有一个基本的了解。 为…

python爬虫爬图片教程_python爬虫实战之爬取京东商城实例教程

前言 本文主要介绍的是利用python爬取京东商城的方法&#xff0c;文中介绍的非常详细&#xff0c;下面话不多说了&#xff0c;来看看详细的介绍吧。 主要工具 scrapy BeautifulSoup requests 分析步骤 1、打开京东首页&#xff0c;输入裤子将会看到页面跳转到了这里&#xff0c…

安卓camera总体框架

今天是周五了&#xff0c;时间过得真快&#xff0c;通常这个时候&#xff0c;我都还沉醉了上班的状态中&#xff0c;说到上班&#xff0c;我是认真的&#xff0c;我非常喜欢上班&#xff0c;特别是今天&#xff0c;我会听到一声优美的声音&#xff0c;我的银行卡会多出一些钱&a…