想当黑客?浅谈C语言编程:不会这个知识就别想了!

浅谈C语言数据结构——链式堆栈

看到标题点进来的朋友,应该对黑客这个名词很敏感吧?我想应该是这样的,但是你们知道作为一名黑客需要学习哪些知识吗?小编不是什么大佬,但小编可以明确的告诉你,学习C语言是必不可少的一步,为什么?因为C语言是一个非常“底层”的语言,也是应用最广泛编程语言。你可以这样理解,最底层的是机器语言,紧接着的是汇编,然后就是C语言。

这是机器语言,看不懂?我也看不懂

学习C语言的过程中,数据结构是必须要掌握的,今天小编就跟大家讲一下数据结构中的堆栈——链式堆栈。

今天要讲的链式堆栈,对于一些刚入门的小伙伴可能比较难以理解,因为链式堆栈涉及到C语言中最令人头疼的知识点——指针。在小编看来,链式堆栈就相当于对指针进行操作,为什么呢?请看下文↓

小编给大家推荐一个学习氛围超好的地方,C/C++交流企鹅裙:870963251!适合在校大学生,小白,想转行,想通过这个找工作的加入。裙里有大量学习资料,有大神解答交流问题,每晚都有免费的直播课程

创建节点

我们创建一个结构体来充当堆栈的一个节点,这个结构体有一个数据域和一个指针域,数据域用来储存数据,这里小编用来储存整型数据指针域用来指明栈顶的下一个节点。不理解的可以看下图↓

这是我们创建的堆栈节点

我们的栈顶指示器永远指向左边(上图)的第一个节点,最左边的节点为栈顶,最右边的节点为栈底,堆栈数据的添加和删除都是在栈顶进行的,遵循“后进先出、先进后出”的原则。节点创建完毕之后,我们来创建我们需要的函数,这些函数并不是必要的,在这里小编只是用来给大家做示例。

堆栈属于一种数据结构,实现它并不意味着我们一定要写某种形式的代码,某种形式的函数才能实现,堆栈是一种数据元素与数据元素之间逻辑关系,我们只要实现这种逻辑关系就可以了,不论以什么形式实现

初始化并创建第一个节点

小编这次示例中一共有4个函数,这四个函数分别实现初始化堆栈、出栈、入栈、遍历栈堆。我们先创建“初始化栈堆”函数,这个函数很简单,它创建一个堆栈的第一个节点,并将它初始化(存入第一个数据)。具体实现步骤看下图↓

head变量是一个全局变量,它用来指明当前堆栈的栈顶,充当栈顶指示器,我们利用栈顶指示器来增加或删除堆栈节点。head是一个指向“堆栈节点类型(inn)”的指针,在创建栈顶指示器或者堆栈节点时候,要注意变量的作用域,因为你创建的函数很可能无法改变它的值,怎么避免呢?这就要用到指针了,因为你可以指明某个变量的地址,这样一来函数就可以根据它的地址来对变量进行操作了。

入栈

入栈函数也非常的简单,稍稍认真看一会就能明白了。细心的小伙伴可能会问,为什么要用malloc()函数来申请一块inn类型大小的内存呢,直接申明一个inn类型变量,用head的next成员指向它不就行了吗?答案是:“我们接下来要用free()函数来释放内存”,看不懂这里?没关系,当你用源码练习的时候你就知道了!

出栈

出栈函数和入栈函数是有一点关系的,因为出栈函数中的free()函数能释放掉入栈函数动态申请的内存。出栈函数仅仅是一些指针与指针之间的转换而已,没有涉及到一些新的知识,理解这个函数仅仅需要你理解指针就可以了。具体的实现步骤就看下图吧,小编也不知道怎么表达出来,你们看着源码就能理解了。

遍历栈堆

便利堆栈函数,这个函数的功能是用来遍历整个堆栈,并打印出堆栈节点的数据,供我们观察我们的程序,是否按照我们预先设计的路线实现。这个函数也是一些指针之间的转换,不是特别难,仔细看就能看出他的工作原理了。

值得注意的是,这个函数中有一个rec指针,这个指针是用来干嘛的呢?它是用来将栈顶指示器“复位”的,通过观察我们可以看到,这个函数是使用栈顶指示器(head指针)来遍历整个堆栈的,所以栈顶指示器会一步步的移到“栈底”,如果我们不将栈顶指示器“复位(调回栈顶)”,那么接下来的堆栈操作就没有相应的栈顶指示器了。

下图是程序运行结果↓

看到标题点进来的朋友,应该对黑客这个名词很敏感吧?我想应该是这样的,但是你们知道作为一名黑客需要学习哪些知识吗?小编不是什么大佬,但小编可以明确的告诉你,学习C语言是必不可少的一步,为什么?因为C语言是一个非常“底层”的语言,也是应用最广泛编程语言。你可以这样理解,最底层的是机器语言,紧接着的是汇编,然后就是C语言。

这是机器语言,看不懂?我也看不懂

学习C语言的过程中,数据结构是必须要掌握的,今天《一碳科技》就跟大家讲一下数据结构中的堆栈——链式堆栈。

实例教学——链式堆栈

堆栈有两种,分别是循序堆栈链式堆栈,顺序堆栈在前一篇文章我们已经讲过了,比较简单很容易理解,感兴趣的朋友打开《一碳科技》的主页即可看到。

今天要讲的链式堆栈,对于一些刚入门的小伙伴可能比较难以理解,因为链式堆栈涉及到C语言中最令人头疼的知识点——指针。在小编看来,链式堆栈就相当于对指针进行操作,为什么呢?请看下文↓

创建节点

我们创建一个结构体来充当堆栈的一个节点,这个结构体有一个数据域和一个指针域,数据域用来储存数据,这里小编用来储存整型数据指针域用来指明栈顶的下一个节点。不理解的可以看下图↓

这是我们创建的堆栈节点

我们的栈顶指示器永远指向左边(上图)的第一个节点,最左边的节点为栈顶,最右边的节点为栈底,堆栈数据的添加和删除都是在栈顶进行的,遵循“后进先出、先进后出”的原则。节点创建完毕之后,我们来创建我们需要的函数,这些函数并不是必要的,在这里小编只是用来给大家做示例。

堆栈属于一种数据结构,实现它并不意味着我们一定要写某种形式的代码,某种形式的函数才能实现,堆栈是一种数据元素与数据元素之间逻辑关系,我们只要实现这种逻辑关系就可以了,不论以什么形式实现

初始化并创建第一个节点

小编这次示例中一共有4个函数,这四个函数分别实现初始化堆栈、出栈、入栈、遍历栈堆。我们先创建“初始化栈堆”函数,这个函数很简单,它创建一个堆栈的第一个节点,并将它初始化(存入第一个数据)。具体实现步骤看下图↓

head变量是一个全局变量,它用来指明当前堆栈的栈顶,充当栈顶指示器,我们利用栈顶指示器来增加或删除堆栈节点。head是一个指向“堆栈节点类型(inn)”的指针,在创建栈顶指示器或者堆栈节点时候,要注意变量的作用域,因为你创建的函数很可能无法改变它的值,怎么避免呢?这就要用到指针了,因为你可以指明某个变量的地址,这样一来函数就可以根据它的地址来对变量进行操作了。

入栈

入栈函数也非常的简单,稍稍认真看一会就能明白了。细心的小伙伴可能会问,为什么要用malloc()函数来申请一块inn类型大小的内存呢,直接申明一个inn类型变量,用head的next成员指向它不就行了吗?答案是:“我们接下来要用free()函数来释放内存”,看不懂这里?没关系,当你用源码练习的时候你就知道了!

出栈

出栈函数和入栈函数是有一点关系的,因为出栈函数中的free()函数能释放掉入栈函数动态申请的内存。出栈函数仅仅是一些指针与指针之间的转换而已,没有涉及到一些新的知识,理解这个函数仅仅需要你理解指针就可以了。具体的实现步骤就看下图吧,小编也不知道怎么表达出来,你们看着源码就能理解了。

遍历栈堆

便利堆栈函数,这个函数的功能是用来遍历整个堆栈,并打印出堆栈节点的数据,供我们观察我们的程序,是否按照我们预先设计的路线实现。这个函数也是一些指针之间的转换,不是特别难,仔细看就能看出他的工作原理了。

值得注意的是,这个函数中有一个rec指针,这个指针是用来干嘛的呢?它是用来将栈顶指示器“复位”的,通过观察我们可以看到,这个函数是使用栈顶指示器(head指针)来遍历整个堆栈的,所以栈顶指示器会一步步的移到“栈底”,如果我们不将栈顶指示器“复位(调回栈顶)”,那么接下来的堆栈操作就没有相应的栈顶指示器了。

关注+私信关键字=源码

小编对这篇文章不是特别的满意,因为我没能将链式堆栈的具体实现步骤讲清楚,所以如果看完这篇文章还有什么疑问的话,可以在下方评论区留言,小编会抽时间回复你们哦!

下图是程序运行结果↓

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨熹的专栏

2 天入门 Java-Day 2

第二天的课程明显就比第一天的要难了,? 表示很吃力,脑子不够用的节奏。 各种概念绕来绕去,脑袋都要绕成了壳。 不过还好没有放弃,想个办法画出各概念间的联系,...

3489
来自专栏zhisheng

干货分享:让你分分钟学会 javascript 闭包 一像素

闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它。...

3485
来自专栏移动端开发

swift 可选类型笔记

       晚上十一点半了,看书累了,原本想睡了的,想了想,还是把刚看的总结一下,把这篇笔记写了吧。广州下雨,真特么的冷。。好了,废话不说了,说正题说说Swi...

19210
来自专栏ACM算法日常

简单计算器(栈的变种)- HDU 1237

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输...

1141
来自专栏贺贺的前端工程师之路

《JavaScript语言精粹》学习笔记

在JavaScript中,/ *可能出现在正则表达式字面量里,所以块注释对于被注释的代码块来说是<u>不安全的</u>。

732
来自专栏大数据架构师专家

python实战系列之python变量

编程语言中为了能够更好的处理数据,都需要使用一些变量。Python 语言的变量可以是各种不同的数据类型,使用变量的时候不需要声明直接使用就可以。

891
来自专栏liuchengxu

Scala 最佳实践:纯函数

我们所处的是一个命令式编程(imperative programming)的时代,这也是我们为何更喜欢用命令式风格写代码的原因。在我们周围的一切都是可变的。虽然...

861
来自专栏编程

Python入门基础连载(2)数据结构

Python数据结构包括了列表(list),元组(tuple),字典(dict)和集合(set),这些也都可以称之为容器,下面Cooldog就和大家一起学习一下...

2027
来自专栏MyBlog

Effective.Java 读书笔记(8)关于equals方法

重写equals看上去十分简单对吧,但是我觉得很多时候重写equals可能会招致一些问题,这些问题有时可能会特别严重,当然了不重写不就完事了吗?但是这只适用于那...

814
来自专栏Java爬坑系列

【JAVA零基础入门系列】Day8 Java的控制流程

  什么是控制流程?简单来说就是控制程序运行逻辑的,因为程序一般而言不会直接一步运行到底,而是需要加上一些判断,一些循环等等。举个栗子,就好比你准备出门买个苹果...

22310

扫码关注云+社区

领取腾讯云代金券