专栏首页诸葛青云的专栏想当黑客?浅谈C语言编程:不会这个知识就别想了!
原创

想当黑客?浅谈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 条评论
登录 后参与评论

相关文章

  • 5天赚十亿!纯C/C++打造“西虹市首富”

    有人就说了,小编你挣着卖白菜的钱就不要操着卖白粉的心了好吗?银行存款有多少心里没点数吗?

    诸葛青云
  • 为什么C++比C要麻烦?程序员这样回答,终于知道他为什么单身了

    同样衍生出来的还有一个小故事:情人节,有人看到C一个人喝酒,便问:你的好哥们C++、Java、Python他们呢?

    诸葛青云
  • 月薪25k大牛教你,如何快速入手C++

    我们的事业就是学习再学习,努力积累更多的知识,因为有了知识,社会就会有长足的进步,人类的未来幸福就在于此。

    诸葛青云
  • 【易错概念】以太坊Solidity函数的external/internal,public/private,view/pure/payable区别

    函数类型是一种表示函数的类型。可以将一个函数赋值给另一个函数类型的变量,也可以将一个函数作为参数进行传递,还能在函数调用中返回函数类型变量。 函数类型有两类:-...

    辉哥
  • c ++成神之路!资深程序员大佬:俄罗斯方块游戏经验分享!

    本课程是通过开发俄罗斯方块游戏来学习C++和Windows的开发技能,实行“玩中学,学中玩”高学习境界。俄罗斯方块游戏比较简单,因此比较适合刚学习过C++编程语...

    诸葛青云
  • 菜鸟进化史之RunTime实战字典转模型

    Bison
  • PL/SQL Profiler 剖析报告生成html

        使用图形化界面工具实施PL/SQL Profiler 易用直观,但是并不是所有的环境都可以使用图形界面软件连接到数据库。对于只能在命令行下进行剖析又需要...

    Leshami
  • 正则匹配抓取input 隐藏输入项和 <td>标签内的内容

    这里不多作解释了,只要提供方法,如果想了解正则匹配,就去百度。 第一条是,匹配出所有的隐藏输入域 1 $patern = "/<input(.*?)type=...

    林冠宏-指尖下的幽灵
  • Hadoop学习17--yarn配置篇-内存管理

    这篇文章来自于:董的博客,记录备查 内存管理,主要是管理nodemanager上的物理内存和虚拟内存。 YARN允许用户配置每个节点上可用的物理内存资源,注意,...

    小端
  • 【赛题分析】分拣与排序(下)

    分拣与排序 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    EdenChen

扫码关注云+社区

领取腾讯云代金券