自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 二叉搜索树

二叉搜索树也叫二叉序列树,若其不为空树,则其性质为:1.若其左子树不为空,则左子树的所有节点都小于等于根节点的值.2.若其右子树不为空,则右子树的所有节点都大于等于根节点的值.3.其左右子树也均为二叉搜索树.4.二叉搜索树中可以允许选择插入相同的值,也可以选择不允许插入相同的值,例如:map/set/multimap/multiset系列容器底层就是⼆叉搜索树,其中map/set不⽀持插⼊相等值,multimap/multiset⽀持插⼊相等值。图1。

2024-09-22 22:50:38 1081

原创 链表List

STL中的List与顺序表vector类似,同样是一种序列式容器,其原型是带头节点的双向循环链表。

2024-08-05 23:59:03 2001 1

原创 vector

vector()//使用初始化列表即可{}

2024-08-03 12:12:45 1163

原创 string类

kw=string。

2024-07-30 19:57:47 939

原创 C++模板初探究

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。我们如果想要实现一个通用的交换函数,其中包含字符型,整型,双浮点型,该怎么办呢?函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。但是这样我们会发现会出现很多冗余的代码,我们能不能实现一个统一的函数来实现交换函数呢?如果模板可以产生一个具有更好匹配的函数, 那么将选择模。上面的代码Add后面不加类型的直接调用非模板函数,后面加类型的调用模板函数.

2024-07-25 16:59:02 522

原创 C++内存管理

C语言中的malloc/calloc/realloc/free虽然在C++中仍然可以使用,但比较麻烦.所以C++中又另外提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数。1. 调用operator new函数申请空间.2. 在申请的空间上执行构造函数,完成对象的构造.

2024-07-22 12:41:32 664

原创 类和对象(下)

• 尽量使⽤初始化列表初始化,因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。• 内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其。建议声明顺序和初始化列表顺序保持⼀致。在B类中进行友元声明,说明A是B的友元类,A可以调用B中的对象,但友元是单向的,所以B仍然不能调用A中的对象.

2024-07-18 22:57:46 644

原创 类和对象(中)

如果⼀个构造函数的第⼀个参数是⾃⾝类类型的引⽤,且任何额外的参数都有默认值,则此构造函数也叫做拷⻉构造函数,也就是说拷⻉构造是⼀个特殊的构造函数。

2024-07-13 23:25:53 1029

原创 类和对象(上)

class为定义类关键字,后面跟上定义类的名字,{}为类的主体,后面要接";",定义在类的成员函数默认展开(inline)• 第⼀个成员在与结构体偏移量为0的地址处。• 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。• 注意:对⻬数 = 编译器默认的⼀个对⻬数 与 该成员⼤⼩的较⼩值。• VS中默认的对⻬数为8• 结构体总⼤⼩为:最⼤对⻬数(所有变量类型最⼤者与默认对⻬参数取最⼩)的整数倍。

2024-07-11 23:50:34 1795

原创 C++初探究(2)

public:// 成员函数private:// 成员变量int* array;size_t top;而我们如果想要对函数定义,则需要专门使用类域来定义函数.

2024-07-09 22:37:42 2466 5

原创 C++初探究

C++可以追溯到1979年,C++之父Bjarne Stroustrup在在使用C语言研发工作时发现C语言的不足,并想要将其改进,到1983年,Bjarne Stroustrup在C语言的基础上添加了面向对象编程的特性,设计出了C++的雏形。学会这几个知识点,我们就可以理解开篇的那个函数代表了什么意思了。C++中许多新语法的提出,其实也就是Bjarne Stroustrup对C语言一些语法的不满并对其进行的改造。我们可以发现,这几个知识点确实对应着C语言语法里一些较为不方便的地方。

2024-07-08 23:20:21 993 8

原创 排序的总结

快速排序:时间复杂度:O(logN),空间复杂度:O(logN),稳定性:稳定性:不稳定:单趟排序时可能会改变位置。选择排序:时间复杂度:O(N^2),空间复杂度:O(1),稳定性:稳定性:不稳定,交换过程中可能改变相同值的位置。希尔排序:时间复杂度:O(N^1.3),空间复杂度:O(1),稳定性:稳定性:不稳定。堆排序:时间复杂度:O(logN),空间复杂度:O(1),稳定性:稳定性:不稳定。冒泡排序:时间复杂度:O(N^2),空间复杂度:O(1),稳定性:稳定性:稳定。

2024-07-08 12:07:34 382

原创 计数排序的实现

每找到一个值则在count数组中对应的位置加一,再在count数组中找到数字上方的count值,count值为几,则打印几次数组中的值.对一个数组进行遍历,再创建一个count数组。

2024-07-07 22:38:52 341

原创 归并排序的实现(递归与非递归)

基本思想:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。空间复杂度也类似于堆排序,每一层有N个,有logN层,则时间复杂度为O(logN).一共10个数据,如果显示大于9的数据都是溢出的数据,而数据溢出分为三种情况。这种代表右边已经是大数,我们不用管,直接尾插入新数组即可.

2024-07-07 21:44:11 538

原创 快排的非递归实现

初始状态下,初始化prev为left,cur为left+1,循环结束条件为cur <= right. 如果cur的值小于keyi,则cur与prev均向后移动,并且交换prev与cur的值;快排的递归实现,在深度过深时会存在栈溢出的风险,所以我们需要掌握快排的非递归写法。上次我们使用了hoare的快排单趟写法,所以这次我们使用前后指针法.

2024-07-06 21:14:05 480 1

原创 快排的实现

单趟:先假定第一个数设为key,如果左边指针的值比key大,且右边指针的值比key小,则将其交换.当左右指针相遇,则左边都比key小,右边都比key大,则以中间为标识,中间位置一定比key小(后续证明)再对其左右进行排序(递归实现)R先走,没有找到比key小的,直接与L相遇,L停留的位置是上一轮交换的位置,上一轮交换,把比key小的值,换到L的位置了.但是这样的结构对于有序数组的排序有个致命的问题:栈溢出,这是由于keyi的取值固定为一边,keyi会被一直调整,所以我们期望取得一个中间值作为key.

2024-07-02 11:59:59 611 5

原创 希尔排序的实现

我们将一直要改变的那个数设为tmp,将它与前面的数(end)比较,如果tmp较小,则进行交换,先将啊a[end] 覆盖a[end + 1],再--end达到tmp继续与前一个数比较的效果,最后达到效果.插入排序的原理是从第二个数开始,与前面的数相比较,如果比前面的数大,则与其交换,并且此移动过程会一直持续直到前k(k为此次刚开始移动的数的位置)个数达到有序为止;我们发现,希尔排序的速度是与堆排序是一个数量级的,而插入排序的速度也是比冒泡排序要快一个量级的.),所以希尔排序的速度算是非常快的,有实践意义。

2024-06-28 17:16:20 737 4

原创 链式结构二叉树练习

此题所给函数形参中没有数组,所以我们要单独开辟一段空间来放数组,用malloc函数,最后直接返回数组即可.

2024-06-26 12:02:46 469

原创 调建堆的时间复杂度的计算与topK问题

将所有数据存储到堆里面,再进行堆排序即可,但如果要求低内存我们就可以分k次,每次找10个,再将k个查找的堆中找到的共10k个数据再进行堆排序即可。剩下的数与栈顶数据相比较,如果比栈顶数据大,就覆盖并且向下调整,这样,这个k个数的小堆就是我们所要的最大的那k个数.这里我们创建了10万个数据,并且我主动将其中的几个数据加上几个0检测算法是正确的.而要求出该和式的计算,利用错位相减法,两边同乘2,再两式相减即可得。再建立k个数的小堆,并读取剩下的N-k个数.个节点,最坏需要向下调整1次.

2024-06-20 12:12:58 528 6

原创 堆的实现及其应用

对于堆中数据的删除,删除叶子结点数据意义不大,我们主要是要删除顶层节点数据,思路将顶部数据进行调整到最后的叶子结点处,在对其进行删除即可。堆在数组中存储,所以根节点的小标为孩子节点下标减一再除以二,向上调整即将孩子节点向上调整,直到满足要求的大堆(小堆)建成。如果升序建小堆,将顶层最小数据取出后,导致后面数据顺序全部混乱,所以我们建大堆。如果降序建大堆,将顶层最大数据取出后,导致后面数据顺序全部混乱,所以我们建小堆。将最大的数往堆最后位置数据交换,再将其放入新数组的最后一位即可。

2024-06-14 20:53:49 500

原创 树结构的实现

假设父亲在数组中的下标为i,则左孩子在数组中的下标是:2*i+1;树是一种非线性的数据结构,它是由n个有限节点组成一个具有层次关系的集合,它看起来像棵树,所以称其为“树”。一颗二叉树是节点的一个有限结合,该集合或为空,或为由一个节点加上两棵树(分别称为左子树和右子树)组成。当且仅当其每一个结点都与深度为K的满二叉树中编号从1至N的节点,即称为二叉树,要注意的是。一个二叉树,如果每一个层的结点数都达到大值,则这个二叉树就是满二叉树。完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。

2024-06-12 22:26:25 447

原创 队列的实现及其应用

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作,具有先进先出的效果。入数据的一段称为队尾,出数据的一段称为队头。队列的应用是:1.维持公平性(抽号)、2.广度优先遍历。

2024-06-06 17:08:56 579

原创 栈的实现 (数组实现)及其应用

首先,我们应该对题目进行分析:这题如果我们只进行数量匹配,即左括号与右括号数量相等,会发现会存在反例:))((。于是,我们可以先让左括号入栈,再将右括号出栈顶与左括号进行匹配。由于栈的先进后出性质,这题与栈有天然的契合性。栈是一种线性表(逻辑上连续),它只允许在固定的一端进行插入和删除,进行数据插入和删除的一端称为栈顶,而另一端就被称为栈底。如果我们想要取出栈中的元素,我们就要每次将栈中的top删除,然后再每次访问栈顶,从而达到访问栈的效果。栈的删除称为出栈,出数据在栈顶。栈的插入称为圧栈,入数据在栈顶。

2024-05-30 22:21:00 681 6

原创 随机链表的复制

想要实现如图所示效果,首先用malloc创建节点,然后后插入每个原节点的后面,这里要注意的是,应该先改变插入节点的next指针,防止因为覆盖导致原指针的next指针无法被找到。通过后插节点解答的优越性就体现出来了,将难以寻找的random节点通过后插copy节点实现新的copy节点的random指针在原节点的random指针的下一个位置。在这里我们为了防止覆盖要多创建一个next指针存放节点位置,并定义头节点与尾指针来进行。像这样,通过化繁为简的方法将复杂的问题分为三块较为简单的函数,就可以解决问题了。

2024-05-29 16:42:33 423

原创 链表带环问题的思考

假设slow进环后移动的距离是L,假设此时fast已经移动了x圈,则fast总共移动的距离为:L + x * C + C - N。3L == L + x * C + C - N.化简可得 2L == (X + 1)*C - N,2L一定是偶数,(x+1)*C一定是偶数,N是奇数,于是我们发现,这个等式不可能存在:因为偶数不可能等于偶数减奇数。当slow进入环时,不妨设fast与slow的距离为N,每一次slow和fast前进时,它们之间的距离每次减一,N、N-1、N-2...2、1、0.故一定会相遇。

2024-05-28 11:44:08 1058

原创 链表练习题

做题时要多画图,通过画图将题目弄清楚可以起到事半功倍的效果。

2024-05-27 17:18:21 293

原创 链式结构二叉树的应用

本文将对链式结构二叉树的几种功能进行实现与讲解在链表结构二叉树中,递归的使用是必不可少的,在使用的过程中,要时常问问自己:这个递归结构可不可以这样用?具体的逻辑实现过程是怎样的?只有这样,才能学好链表结构二叉树。!!

2024-05-21 17:57:20 1177

原创 二叉树链式结构的实现

二叉树链表结构十分依赖递归,通过递归将比较复杂的结构转化成较为简单的代码,这是我们链表结构需要学习的东西。

2024-05-20 17:28:39 1127 6

原创 双向链表专题

相比于单链表来说,双向链表要遍历的地方少一些了,链表的节点的前一个节点也更好找,而不像单链表那样每找一个prev都要遍历链表,这也大大减少了我们的代码量;同时也使我们更容易地循环链表,为节省空间起到了作用,是我们用的更多的一个链表结构。

2024-05-17 23:41:35 1125 7

原创 单链表的应用(快慢指针)

对于链表类题,我们可以使用创建链表额外设值存值来避免创建链表通过多指针来改变链表的指向一种比较巧妙的方法-----快慢指针......

2024-05-16 16:50:01 261 2

原创 单链表的实现

顺序表的容量变化,对于增容,我们一般是以两倍的数量进行成倍增长,这样可能会出现空间的浪费,在这里,我们就要介绍一种新的线性表----链表就像火车车厢,每节车厢都是独立的,火车是由一个一个车厢组成的,而链表是由一个一个节点组成的。通过malloc函数创建node指针作为节点,然后,我们再通过结构体指针next将节点连接起来。链表的逻辑结构是线性的,但它的物理空间是非线性的。通过有一个结构体指针来指向下一个链表的节点。2.指向下一个节点的地址的指针。于是,我们来尝试创建几个节点。我们利用结构体来定义链表。

2024-05-14 12:13:28 649 3

原创 数组训练题(合并数组和移除数组元素)

但在这里,我们还会遇到,l2已经离开循环,但l1仍然没有移动的情况,如果num1刚开始里面的值很小的话,l1将不会移动,但题目告诉我们,num1是有序的非递减数组,所以我们不用考虑这种情况。这里,我们有两种思路,最简单的是将第二个数组直接插入第一个数组后面,再直接进行排序,但如果要进行排序,那么时间复杂度必然会较高,所以,我们使用变量检测的方法。假设数组里面是3223这几个数,如果我们想要删除vall = 3,我们就用。这里的numsSize是原数组的总长度,这样,这题就做完了!这样,我们的代码就完成了!

2024-05-11 23:01:53 347 1

原创 顺序表的运用(通讯录)

在这里我们先要单独创建一个结构体来储存接收联系人的信息,最后再用尾插将这个结构体存储的联系人数据并入将要打印的con中。接下来的代码实现很多都利用到了前面的顺序表,我之前有顺序表的详解,具体可以去我空间回顾。要实现通讯录,我们就得利用前面所学的顺序表,因为通讯录的底层数据结构就是顺序表。将每个联系人的信息储存起来,这里我们储存联系人的姓名,性别,年龄,电话,住址。在完成程序功能的实现后,我们还要进行输入界面的创建。为方便后续修改,这里的数组中的值是自己定义的。打印出一个界面的样子。

2024-04-25 22:19:13 515 3

原创 顺序表专题(下)

这里我们让程序测试起来,先尾插1和3,再头插4和5,再在指定位置插入44,再头删,再尾删,再在指定位置删除两次数据,最后测试寻找函数。尾删不会担心空间不够,所以不需要用SLCheckCapacity来判断空间大小。这样,一个数据表的实现就完成了!最后我们来测试一下代码。

2024-04-24 09:21:40 222

原创 顺序表专题(上)

当谈到顺序表,就要谈到数据结构,数据结构是计算机存储,组织数据的方式。

2024-04-22 18:24:34 285

原创 C语言文件和文件操作

若数据在内存中以二进制的方式存储,若不加转换地输出到外部文件中,就是二进制文件,我们直接打开将会出现乱码,因为计算机会将其视作文本文件打开,导致出现问题。对于外部设备输入输出的数据,计算机通过一种方式:"流"来处理,而且c语言启动的时候,默认打开了3个流,stdin、stdout、stderr,这三个流的类型是:FILE*,通常成为文件指针。磁盘上的文件就是我们说的文件,一般分为两种:程序文件(我们写出的代码---.exe/.obj...),数据文件就是我们操作的对象。为方便起见,文件标识通常写作文件名。

2024-03-26 23:29:38 298

原创 memcpy的使用和模拟实现

1.memcpy函数从source的位置开始向后复制num个字节的数据到destination指向的内存位置。3.如果source和destination存在任何的重叠,复制的结果都是未定义的。2.这个函数在遇到'\0'的时候并不会停下来。

2024-03-20 22:45:42 136 1

原创 strlen与sizeof的相关练习

对于arr1来说,里面就没有"\0"的存在,计算机读取的时候就会越界访问,导致给出一个随机值。对于arr2来说,里面存在"\0",strlen函数读取首元素的地址,向后读取到隐藏的"\0"位置,是3个。统计的是从strlen函数的参数中找到这个地址开始向后,知道找到"\0"之前的最后一个字符为止中字符的个数,若没有找到"\0",strlen会一直向后查找,直到找到为止,所以会存在越界访问的情况。sizeof是操作符,所以后面的括号可以不加,无论是整型还是a的具体数值,其大小都是4字节,所以此处打印3个4。

2024-03-07 16:37:06 266

原创 指针初探究2(函数指针数组)

我们可能会想到利用switch语句来进行运算种类的选取。现在,如果让你编写一个可以进行加减乘除四则运算的计算器的代码,你会运用什么知识呢?这种方法,我们也称其为转换表。

2024-02-02 23:22:14 339 1

原创 结构体及指针初探究(1)

C语言已经提供了内置类型,例如:char,short,int ,long,float,double等,但如果我想描述一个事物,单单靠这些内置类型是不够的,例如描述一个学生,或者描述一本书,此时的单一内置类型就是不行的,描述一个学生需要描述身高,体重,学号,成绩等等。而在计算机中,你想找到一个数据,就必须先找到其地址,而这个地址,我们也称其为指针。此时指针变量pa的值就是a的值 5,我们对pa的值进行操作就可以间接地将a值改变。而整型变量占四个字节,所以应该会有四个连续的地址,打印出来的是最小的一个地址。

2024-01-26 23:27:42 486 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除