自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++-vector模拟实现

##vector底层相当于是数组,查看源码可以发现,这个类的私有成员变量是三个迭代器;在实现时迭代器就可以当作是vector里面的元素的指针类型;###vector是一个类模板,实现时也应当按照这样的写法用一个模板去实现,类模板vector中数据类型是T;_start指向vector的开始地址,_finish指向vector的有效元素的结束地址,_end_of_storage指向vector最大存储数据的地址;

2024-10-03 16:23:13 759 1

原创 C++-list使用学习

emplace_back也是尾插数据,但是可以直接传值去尾插,这样省去来拷贝构造的步骤,有一点优化;而push_back不能直接传值去初始化;list<A> l1;list<A> l2;//可以直接给值。

2024-09-27 09:29:04 1029

原创 C++ vector的使用

##vector介绍:vector是C++中引入的类模板,这个模板相当于顺序表,里面可以存放不同类型的数据,同时实现了多个接口去完成对vector对象的各种操作;基本使用方式:#include<vector>//包含头文件//展开头文件中的命名空间int main()//定义一个vector对象,这个对象存放的是int类型的数据;

2024-09-16 13:01:07 1097

原创 C++string模拟实现

C++中的string相当于是一个类模板,包含在头文件string中,具体实现在这个头文件中名为std的namespace中,所以一般在直接使用string时,展开std;那么模拟实现string时,首先要将实现的内容放在一个自己定义的命名空间里面,在这个命名空间里面再定义自己的string类;这里实现string吗,模板的主要接口功能。

2024-09-14 17:29:40 1193

原创 C++ string类—容量、元素获取

这些成员函数是获取string类里面的元素的;

2024-09-01 20:55:50 574

原创 C++ string类—string修饰符、操作、非成员函数

这个成员函数给一个string类类型的对象进行追加,在现有的string后面追加string类、字符串或者字符;

2024-09-01 16:50:50 727

原创 C++ string类—构造、遍历、迭代器

## string是C++中的一种类,在标准库中的;可以直接对字符串进行一系列操作。

2024-08-27 19:24:06 894

原创 C++模板初阶

##引言:写一个交换的函数Swap,形参的类型会因为传入的实参的不同而需要改变,这样在频繁使用交换函数并且传入的实参的类型不同时会很麻烦,要写很多重载函数。而重载函数较多时会出现代码复用率较低和可维护性较低的问题;在C++里面引入了模板的概念,模板可以用来实例化函数,让函数的形参类型根据实参的不同来生成,这样,利用一个函数模板就可以频繁操作不同类型的实参了。模板是泛型编程的基础(泛型编程是与类型无关的通用代码,是代码复用的一种手段)

2024-08-24 17:49:30 793

原创 C++内存管理

int main()//动态申请一个A类型的空间//动态开辟一个A类型的空间并且传参初始化//释放空间delete p1;delete p2;return 0;对于内置类型,使用new(delete)或者malloc(free)都是一样的;

2024-08-21 20:43:20 967

原创 C++类和对象(3)

/初始化列表//1、初始化了,正常初始化//2、没有初始化//a、调用缺省值去初始化//b、没有缺省值:// x、对于内置类型,初始化的值随机// y、对于没有默认构造的自定义类型,编译出错//3、没有默认构造的自定义类型、const修饰的类型、引用类型必须在初始化列表初始化若是初始化列表里面成员变量后面的括号里面就是一个具体的值,那么就用这个值;若是初始化列表里面写这个成员变量,那么就调用成员变量声明处的缺省值;

2024-08-16 07:32:50 546

原创 C++类和对象(2)——const 成员函数、 取地址运算符重载

const放在成员函数参数列表后面进行修饰,那么这个成员函数就是const成员函数;const实际修饰的是成员函数形参中包含的this指针的形参,表明在这个成员函数内部不能对成员进行修改。例如日期类里面的Print成员函数,它的形参是Date* const this,用来接收实参&d,那么在这个Print函数参数列表后面加上const,Print函数隐含参数就成了 const Date* const this,那么就不能通过这个this指针来改变指向的对象的数据成员了。

2024-08-13 21:29:41 959

原创 C++类和对象(2)——拷贝构造函数、运算符重载

当运算符作用于类类型时,C++允许我们对运算符进行重载,对其赋予新的意义;当我们直接使用运算符去操作类类型时,编译器会报错,这个时候要使用运算符重载;运算符重载是一个函数,它具有特殊的名称,它的名称是由operator加上普通的运算符构成的,和其他函数一样,这个函数具有类型和返回值以及参数;但是运算符重载这个函数规定必须有一个参数是类类型的参数;运算符重载的运算规则和普通的运算符一样,在运算符被重载之后,它的优先级和结合性和内置类型的运算符保持一致;

2024-08-10 21:38:24 810

原创 C++类和对象(2)——构造函数和析构函数

##前言:此文主要介绍C++中的六种默认成员函数;默认的意思就是我们不写编译器会自动生成;这些函数在类里面自动生成;但是我们也可以自己写;学习这几种默认成员函数从两个方面入手:(1)编译器自动生成时,这些函数会做什么?有哪些行为?这些行为是否满足我们的需求?(2)我们自己写时,要怎么写才能满足我们的需求?

2024-08-08 19:48:53 718

原创 C++类和对象(1)

类的关键字是class,后面接上我们自己取的一个名称,然后接上{};{}里面是类的主体,花括号后面必须要有分号;类的主体里面为类的成员;类里面的变量称为类的属性或者成员变量,类里面的函数称为方法或者成员函数;C++中的类和C中的结构体定义方式差不多;在C++里面,struct升级成了类,class和struct都可以定义类;同时,C++中的struct和C中的struct有不同的地方:(1)C++中的struct中可以定义函数,C中不行;

2024-08-07 20:42:58 865

原创 C++入门基本语法(2)

引用不是新定义一个变量,而是给已存在的变量起一个别名,编译器不会为引用变量开辟内存空间,它和它所引用的变量公用同一块内存空间;引用的写法:变量类型& 引用别名 =变量;别名b和a公用一块内存地址,改变a,b也改变;改变b,a也改变;

2024-08-04 19:19:26 702

原创 C++入门基本语法(1)

(1)namespace是一种关键字,后面跟上命名空间的名称,这个名称是我们自己命名的,然后接上{},{}里面是空间的成员,成员可以是变量、函数、或者自定义类型(如:结构体),{}后面不用像结构体那样接上分号 ';(2) namespace本质上是一个域,这个域定义在全局域里面,这个域相当于一堵墙,把域里面的成员包起来,不同的域里面可以起相同名称的不同变量,成员名称如何起不受外面的影响,避免了冲突;(3)namespace只能定义在全局,可以嵌套定义;

2024-08-03 19:03:22 991

原创 LeetCode-二叉树

反之,申请一个二叉树节点,再让此时访问的数组里面的字符赋值给这个节点val,同时让这个节点的左子树和右子树同样进行构建二叉树的操作,形成递归,最后访问的符号是‘#’,返回NULL,这时构建完毕,递归返回;定义一个新的函数,依次拿根节点的值和左右节点的值去和data值比较,若是不同则返回false,反之则继续递归比较,当root为空的时候,就说明比较完了,比较完还没有不一样的就返回true;第二层之后比较的就是左子树和右子树的根节点,所以递归传参的时候传的是根节点的左子树根节点和右子树根节点;

2024-08-02 17:30:13 787

原创 二叉树实现(2)

首先当遍历到第一个为空的节点就跳出循环,它所在的上一层的节点都已经遍历完,那么它上一层所有节点的左右节点都已经存放到队列里面了(删除队列里面的根节点和存放这个根节点的左右节点的动作是同一次循环进行的),那么这些左右节点一定有放到这个空节点后面的节点吗,若是空节点后面都是空节点,那么就说明最后一层的节点是连续摆放的了,那么二叉树就是完全二叉树,和假设不是二叉树的情况不符合;下一次循环还是先打印队列对头的节点,再删除它,每次都要判断删除掉的节点的左右指针指向的节点是不是空,不是空就插入队列;

2024-07-31 16:22:44 309

原创 二叉树实现(1)

为了方便理解,首先从二叉树的前、中、后三种遍历说起;首先,手动创建一个简单的二叉树作为测试用例;}BTNode;exit(1);那么此时该二叉树就是这样的:叶子节点(3、5、6所在的节点)的左右子树都是NULL;

2024-07-31 14:13:56 860

原创 堆的相关算法效率计算

首先我们知道堆是完全二叉树,考虑情况最坏也就是堆的节点个数最多的情况:完全二叉树的最后一层节点是满的(即满二叉树),这里展示的图片是四层,现在假设有一颗满二叉树,它的总高度是H,也就是H层;假设总共的节点有N个;每一层的节点个数是 2^(h-1) (h是每一层的高度):例如第一层就是 2^0 即一个节点后面依次类推;那么N=2^0+2^1+2^2+2^3+……2^(h-2)+2^(h-1),通过等比数列计算公式可知,N=2^H -1;

2024-07-25 18:16:50 1003

原创 堆的基本实现

在提出堆的概念之前,首先要了解二叉树的基本概念一颗二叉树是节点的有限集合,该集合:1、或者为空;2、或者由一个根节点加上两颗分别称为左子树和右子树的两颗子树构成;堆就是一颗完全二叉树;堆有两种:小堆和大堆堆在内存上的存储是数组形式的(物理结构);我们认为想象成链式结构(逻辑结构)通过数组结构去实际存储,有这样的规律:每个父节点的下标乘以2加1就是左孩子节点,加2就是右孩子节点;无论是左孩子还是右孩子,其下标减去1再 /2 就是父节点的下标,这就是通过数组存储堆(完全二叉树)的优点。

2024-07-25 14:42:05 587 1

原创 栈和队列的相关题目

int* a;int head;int tail;int k;//后续会用到队列长度int size;obj->k = k;return obj;//走到这里说明还没有满,size小于4return -1;return -1;free(obj);obj = NULL;/***/此处为开辟多的空间,为了避免假溢出的问题定义一个size记录队列里面元素的个数,当size==k的时候就说明满了,当size==0的时候说明为空;

2024-07-20 13:58:37 1147

原创 队列的实现

在前面实现单链表或者是双向链表的时候,都是先在头文件里面定义好链表节点指针,这个操作在队列里面也是同样的,QNode结构体指针里面同样包含next指针和节点数据val;而下面的Queue结构体存在的原因是这样的:首先队列的特点就是先进先出,出涉及到头节点,进涉及到尾节点,此时定义好一个结构体Queue让传参更为方便,只需要传Queue结构体指针就可以实现队列的基本操作了,并且最重要的一点是每次进行尾插的时候不需要找尾,我们知道单链表找尾需要遍历链表,效率较低,所以定义好一个队列结构体是优大于劣的;

2024-07-18 20:58:59 730

原创 基于数组的栈的实现

栈是一种特殊的线性表,它只允许在一端进行数据的插入和删除操作,这个进行插入和删除的一端被称为栈顶,另一端称为栈底;栈中的元素遵守后进先出的原则LIFPO(last in first out)压栈:栈的插入操作叫做压栈\入栈\进栈,入数据在栈顶;出栈:栈的删除操作叫做出栈,出数据在栈顶。

2024-07-18 11:54:49 261

原创 顺序表和链表区别

顺序表的劣势是容量不够的时候需要申请空间,而申请空间用到realloc函数,这个函数拷贝数据,释放就空间,开辟新空间,这样就相对降低了程序的效率;链表只需要按需申请节点空间,相对提高了空间的利用率。链表却不一样,链表的数据,即每个节点都是malloc开辟的,它们在内存上的存储不一定连续,那么在把一个数据载入缓存的时候,已知这个数据附近的数据也要载入,可是链表的数据内存空间不连续,载入时会把一个数据附近不需要的内容载入缓存区,这些不需要的会把缓存区里面有用的数据挤出去,这样就降低了缓存利用率。

2024-07-17 19:44:51 341

原创 LeetCode-随机链表的复制

解释为什么要这样:假设现在要实现这个链表中一个拷贝节点的random指向,已知其他拷贝对象的next指向的就是拷贝节点;只需要让这个拷贝节点的random指向它自己拷贝对象的random的next,这个被指向的拷贝节点就是原链表中这个要实现random指向的拷贝节点的拷贝对象的的random的next指向的拷贝节点;先一个一个节点的拷贝,并且把拷贝的节点放在拷贝对象的后面,再让拷贝节点的next指向原链表拷贝对象的下一个节点,这样做的目的是实现拷贝节点的插入,即拷贝好的节点都放在原链表两个节点之间;

2024-07-17 18:54:18 296

原创 LeetCode-环形链表、环形链表 II

判断是否有环,使用快慢指针,开始时都指向头节点,快指针每次走两部,慢指针每次走一步,如果在走的过程中,慢指针和快指针相同(也就是快指针和慢指针指向的节点的同)那么就说明这个链表是带环链表;若是这个链表代换,那么快慢指针一定不会走向NULL;只会在这个链表里面循环走下去,并且当循环条件允许时都会进环;

2024-07-16 12:18:04 1434

原创 LeetCode-返回链表倒数第K个节点、链表的回文结构,相交链表

本体思路参展寻找中间节点的方法,寻找中间节点是定义快慢指针,快指针每次走两步,慢指针每次走一步,当快指针为空或者快指针的下一个节点是空时,此时的慢指针指向的节点就是中间节点;并且此时的快指针和慢指针之间的节点个数就是整个链表的一半;据此同理,可以定义快慢指针,使得快指针走到尾的时候,与慢指针之间的差距恰好是k个节点,那么此时的慢指针就是题中要求的节点;

2024-07-15 14:38:26 482

原创 算法的时间复杂度和空间复杂度-例题

本题要求的时间复杂度是O(n) ,所以我们不能用循环嵌套;

2024-07-14 20:03:57 494

原创 算法的时间复杂度和空间复杂度-概念

在计算机科学中,时间复杂度是一个函数,它定量地描述了一个算法运行所耗费的时间;从理论上来说,这是不能算出来的,只有把这个算法放在编译器里面运行去比较才能得知这个算法的运行时间长短;所以为了方便衡量,才有了时间复杂度的分析方式:一个算法的运行时间与语句的执行次数成正比,算法中基本操作的执行次数,成为算法的时间复杂度。那么如何来确定算法的语句执行次数呢?// 请计算一下Func1中++count语句总共执行了多少次?i < N;++ i)j < N;k < 2 * N;

2024-07-14 12:59:30 1247

原创 双向带头循环链表

何为双向:此链表每一个节点的指针域由两部分组成,一个指针指向下一个节点,另一个指针指向上一个节点,并且两头的节点也是如此,头节点的下一个节点是尾节点,尾节点的上一个节点是头节点;何为带头:此处的头节点是一个 哨兵位,在链表定义时就要手动设置,此节点只是起到头的作用,并不是真正的节点;在双向带头循环链表为空时,链表中只有一个头节点,当链表中连头节点都不存在时,此链表不能被称作一个有效链表;

2024-07-11 15:45:18 823

原创 LeetCode(2)合并链表、环形链表的约瑟夫问题、链表分割

则第二次循环进入else语句:开始删除数据,但是为了找到之后的链表节点,先让prev的next指针指向pcur的next指向的节点,再删除pcur(此时是2,符合题意,报数为2的删除)再让pcur为prev->next。此时循环进入if语句,count变为2(正常报数),prev的val为3,pcur的val为4;再一次循环进入else语句,开始删除数据让prev的next指向pcur的next(也就是val为5的节点),再删除pcur(val为4的节点),让pcur为prev的next;

2024-07-10 20:34:42 460

原创 LeetCode(2)-反转链表、删除链表中等于val的节点、返回链表中的中间节点

目的是让n1成为新的头节点,让n2的next指向n1,让n1=n2,n3=n3->next,那么循环一次之后的链表是NULL<-1 2->3->NULL(此处->表示箭头),第一次循环之后n1数据域是1,n2数据域是2,n3的数据域是3;当链表为偶数个时当快指针为NULL时返回慢指针;快慢指针,定义两个指针,利用循环,慢指针每次走一步,快指针每次走两步,最后快指针的next指针为NULL或者是快指针本身为NULL时,结束循环 ,返回慢指针;n1数据域是3,n2是NULL,n3是NULL,循环结束。

2024-07-09 20:04:11 397

原创 单链表详解(2)

查找节点我们是通过看数据域来查找的,查找节点函数的返回值类型是SLTNode* 因为不涉及到链表的修改,我们只需要传值;同样地,首=首先要断言看链表是否为空;为了方便遍历链表,我们定义一个节点pcur,在循环中没经历一个节点时,就拿这个节点地数据域的值和传入的数据进行比较,直到最后一个几点,如果某个节点的数据域的值和传入的值相同,就返回这个节点,若是遍历完链表还是找不到,说明这个链表没有要查找的节点,那么就返回NULL。

2024-07-09 12:48:08 854

原创 单链表详解(1)

链表是线性表的一种,链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑结构是通过链表中的指针链接次序实现的单链表的结构:单链表就像是一节一节车厢构成的火车,每一节都称为一个节点,节点里面有两部分:数据域和指针域;指针域指向的是下一个节点的地址,依次类推;int data;通过next指针我们可以从头一直访问到最后一个节点。return 0;

2024-07-09 11:39:54 1489

原创 移除元素&&合并两个有序数组-LeetCode

题目描述:采用双指针的方法;

2024-07-08 12:30:33 272

原创 基于顺序表的通讯录实现

基于已经学过的顺序表,可以实现一个简单的通讯录。

2024-07-06 21:34:46 601

原创 顺序表(1) 基础(详解+学习历程)

顺序表是数据结构的一种。数据结构是计算机存储、组织数据的一种方式。数据结构中一种称为线性结构的逻辑结构主要是对线性表的学习,线性表包含顺序表。线性表是对一类事物的集合的统称;线性表不一定有物理结构,但是一定有逻辑结构;顺序表含有物理结构,也含有逻辑结构;含有物理结构就是那一类事物实际上是按照一种特定的有序的方式排列,而含有逻辑结构是人为可以想象成这类事物是按照一定顺序排列的。举例(一类事物):有几种水果,它们可以被称为线性表。为什么呢?

2024-07-05 13:33:22 766

原创 编译、链接初识——C语言

在接触编程语言的过程中,我最开始只是会照着葫芦画瓢,而不去思考底层的一些原理:我们写在编译器里面的代码是怎样一步一步转换成我们所需要的结果的,这其中究竟发生了什么?这就与编译链接等相关了。本次主要是分享我初步接触编译、链接的一些学习历程。

2024-05-05 22:05:00 847 2

原创 C语言文件操作详解(3)(文件读取结束的判定)

再读写文件时,我们除了会使用读写函数,文件打开方式之外判定一个文件读取结束也非常重要。

2024-04-09 13:03:55 785

空空如也

空空如也

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

TA关注的人

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