本章给大家带来的是C++内存管理。在C语言阶段,我们经常使用malloc,calloc,realloc,free进行内存管理。但是,C语言的内存管理存在很多缺陷,会对程序的稳定性和安全性造成影响。不过,C语言的内存管理同时也给程序员提供了更大的自由度和灵活性,可以更加精细地控制程序的内存使用。而C++有他自己的一套内存管理,就是:new和delete。C++中的内存管理是一项非常重要的任务。C++为开发人员提供了灵活的内存管理功能,但同时也带来了内存泄漏、野指针等风险。所以,小伙伴们一定要扎扎实实弄清楚内存管理~
>?排序可谓是老生常谈了,在这里,我给大家带来一些常用的排序算法。 >?常用的排序算法有八个:**直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序(快排),归并排序,计数排序**。每一个排序算法都有其独特的思想,我们不仅要学会它的思想,还要能够在合适的场景中选出合适的排序算法。因此,这一块,要很熟练很熟练。 >?本章所有的排序均以升序为例来讲解,弄懂了升序,降序也是不在话下。
本章给大家带来的是八大排序中的选择排序和堆排序。选择排序为什么被称为最烂的排序?堆排序如何来操作?最开始如何对数组建堆?
我们在学习当中,最常见的算法莫过于排序算法了!而常见的排序算法有八种,本章给大家讲解八大排序中的==直接插入排序和希尔排序
前面了解了树的概念后,本章带大家来实现一个跟树有关的数据结构——堆。本章有对堆排序和topk问题的讲解普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把 ==堆== (一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。
本章给大家介绍一下树。树的难度相对于前面的数据结构来说,又高了一个台阶,所以我们要先从最基础的开始,也就是本章的一些知识点。树又分为很多种树,如 二叉树,红黑树,AVL树,B树等等,这些的难度都相对较大,所以大家对本章树的一些概念以及一些基本性质的理解必不可少。本章除了对树的介绍,还有基础的二叉树的相关介绍,目的是为了大家能够更好的理解树。
前面我们 用队列实现了一个栈 ,用栈实现了一个队列 ,相信大家随随便便轻松拿捏,而本章将带大家上点难度,我们来 设计一个循环队列。对于循环队列,重点就在一个 ==“ 循环 ”,意思也就是该队列首尾相连形成一个环,但其本质还是不变,队列 先进先出 的性质依旧存在,只不过环的大小有限定(限定放多少数据就只能放多少数据)。那么我们如何来设计这样的一个环,使它既能够像队列一样,又可以体现循环的性质?下面就带大家探讨一波。
上一章我们用队列实现了一个栈,而这一章就带大家用栈实现一个队列。用队列实现一个栈,用的是两个队列,其出栈操作可以说是最麻烦的一步,它通过倒数据的方式最后完成出栈。而用栈实现一个队列,很明显也是需要两个栈来完成的,其出队操作其实也与倒数据的方式有关,不过两个实现方法有所不同。用队列实现栈,是通过队列的 先进先出 的性质来实现栈的 后进先出 的性质;而用栈实现队列,是通过栈的 后进先出的性质来实现队列的 先进先出 的性质,大家别弄混淆了。
前面我们相继实现栈和队列,是不是愁没有练手的地方呢?别担心,本章带大家用队列来实现一个栈!我们都知道,栈和队列可以看作为兄弟,一个后进先出(LIFO),一个先进先出(FIFO),他们虽有不同的性质,但总的来说还是不分家的,因为,我们既可以用队列实现栈,也可以用栈实现队列,而本章就先来带大家来了解如何使用队列来实现栈。
栈和队列可以说是一对好兄弟,前面学习了栈,那队列当然也少不了。对于栈而言,队列可以说具有与他相反的性质,本章就给大家领悟一下队列的魅力。队列是一种简单的数据结构,它的主要性质,就是数据先进先出(FIFO),我们可以利用这一性质,在做某些算法题时,以此为切入点,如:单调队列等等。所以说,我们要熟练其性质。
前面学习了单链表的结构,并且做了些许单链表的OJ练习,相信大家已经对单链表的结构了如指掌。因此,本章带来了与单链表同源的但拥有不同的结构的链表---带头双向循环链表供大家学习。可能大家听到带头双向循环链表这个名字,就会认为该结构很复杂(的确很复杂,是链表当中结构最复杂的),肯定比单链表要难许多,说实在的,如果没有前面单链表的铺垫,直接上这个结构,那肯定挺难的。但现在我们有了单链表的基础,并且做了挺多单链表的题了,也就不用怕了。
本章的OJ练习也是相对简单的,只要能够理解解题的思路,并且依照这个思路能够快速的写出代码,我相信,你的链表水平已经足够了。对于OJ练习(2):其中两道题都可运用快慢指针解题思路,这使得两个题都只需要遍历一次链表即可解答。
对于单链表的OJ练习,需要深刻理解做题的思路</font>,这样我们才能够在任何场景都能够熟练的解答有关链表的问题。关于OJ练习(1):其题目较为简单,思路也好理解,本章与1差不多,难度不大,核心点就在于理解解题思路。
单链表的OJ练习(1) # 反转链表 # 合并两个有序链表 #
在学习数据结构时,单链表可谓是第一个需要跨越的台阶。从`C语言`到`数据结构`,单链表能够真正的反映我们`C语言`到底学的扎不扎实,那是因为,单链表对于`C语言`中的指针,结构体,以及函数模块的实现**有较高的要求。因此,通过本章的学习,要是能够自我实现单链表,那你的`C语言功底`会厚实,你的`代码能力`也会提升。
关于时空复杂度的分析,是每一个程序员的必备技能,本文将带你了解什么是时空复杂度?熟知怎样去计算一个算法的`时间复杂度`和`空间复杂度`
上篇文章介绍了一个程序运行的 编译与链接,其中编译阶段有个预处理,他会对一些预处理指令进行处理,本章就对这些预处理相关的指令,操作符等等进行探讨
每当我们运行一段代码时,编译器都会自动的帮我们编译代码并将代码转换为一个二进制可执行文件(`.exe`), 有了这个可执行文件,便可以执行我们写的程序了。那么编译器对代码的编译以及生成可执行程序的过程是怎样的呢?这个问题便是本文章将要探讨的。
我们有可能会写通讯录,写过通讯录的都知道,如果没有文件操作,程序运行后输入的数据在程序结束就没有了,联系人信息也就没有了,如果不能存放联系人的信息,那通讯录还有什么用?所以必然的我们需要文件操作来将输入的联系人的信息存放到文件当中,下一次运行时再将之前已经保存在文件中的联系人的信息拿出来,这一系列的操作就是C语言的文件操作,对应的就需要使用一些相关操作函数。简单来说,文件操作能够将输入的通讯录的数据存放在硬盘文件中,这样就做到了数据的持久化。
也许你从来就没有听过`柔性数组(flexible array)这个概念,但他是真的存在;柔性数组的概念存在于C99标准当中,C99标准表示:结构体的最后一个成员可以是一个大小不确定的数组,这个数组就叫做柔性数组;既然搭配了`柔性`这一修饰词,那么这个数组就不会是”耿直“的了。
动态内存管理函数可以说很好用,但是有些小危险所谓动态内存分配,就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。 动态内存分配不像 数组 等 静态内存 分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
C语言中结构体是一种用户自定义的数据类型,它相当于一个小型的数据结构,当我们在学数据结构阶段的时候,结构体的运用很常见,所以,基本的结构体的定义和使用,以及结构体大小的计算务必掌握。
内存函数的使用广泛度大于常用字符串函数的使用广泛度,因为字符串函数只适用于与字符相关的,而内存函数适用于各个类型,因为他是从内存出发,对内存进行修改,因此,学会内存函数,可谓收获满满呀。
常见的字符串函数在一定程度上可以让我们在写代码,或者是在刷某些有关字符串的题目时事半功倍,并且常见字符串函数的功能非常常用,因此我们应该熟练使用这些字符串函数,以及部分函数要能自我实现。
虽然数据在内存中的存储这一节知识不常用,但是他能让我们更深刻的理解内存和更严谨的写代码,可以说是一个程序员的必不可少基本功。
本章知识点:指针数组,数组指针,函数指针,回调函数,函数指针数组......
C语言中指针可以说是最接近计算机的一种表达方式了,他是C语言中最难也最重要的一块,这就需要我们细心去学去体会指针的每一步效果,相信大家刚学指针时会有些许困惑,本章我们就来看看指针的初阶把。
数组是由数据类型相同的一系列元素组成的。需要使用数组时,通过声明数组告诉编译器数组中内含多少元素和这些元素的类型。编译器根据这些信息正确的创建数组。普通变量可以使用的类型,数组元素都可以使用。
本章我们用C语言来实现一个初级的三子棋小游戏,三子棋想必大家都玩过,只要每一行或每一列或对角线三个棋相同,那么便获得胜利,由此我们分析下棋的步骤与获胜判断,来构建一个C语言三子棋的代码框架。
分支和循环在C语言中几乎无处不在,作为重要的一部分,精确掌握其语法和运用逻辑,是继续向下学习的“地基”。
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号