自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 TCP的学习

此时我们的序号和确认序号就可以帮助解决这个问题,首先序号就是这些数据的正确的顺序,假设我现在一共有3000字节长度的数据,我分成5块,标记好它每块对应的顺序,谁在一号位就是谁在最前面,谁是五号位谁在最后,当对方收到报文的时候,查看这个是序号一,就把数据接收到,然后回复对方应答,在确认序号呢显示1,表示一号数据已经接收到了。此时我们就要想到一开始的缓冲区了,此时缓冲区的作用就来了,如果第一次发送数据,你没有接收到,或者是接收到了但是并不完整,缓冲区里的数据是不是就有了用途,它可以给你重新发送一次。

2025-09-28 10:21:00 981

原创 http、UDP协议

只要读取前八个字节,就可以把这些数据全部获取到,读到UDP长度的时候,就表示整个报文的长度,也就是UDP首部+数据的长度,然后把把前八个字节分开,就是数据,就实现了报头 和 有效载荷的分离。也就是http 是明文直接传输,明文经过路由器,交换机,运营商的路由器,代理服务器,所以在这些过程中被别人截取,可能被别人把你的隐私信息直接给暴露,有的就可能被篡改。所以就有了https进行加密,进行加密的方法就是中间一层,也就是我们所说的ssl,ssl加密也不是决定安全,毕竟厉害的人那么多。

2025-09-21 19:31:54 762

原创 序列化和反序列的学习

这个确认数据的完整性或者正确性什么的,UDP和TCP就有了各自的特点,UDP是面向报文的,相当于快递,他就会要求传递报文必须是完整的,TCP是相当于自来水接水,所以呢他就有可能传过来的数据是一段一段的,我们在报头里就会有一些报文的长度啦,还有什么分隔符啦,分开报头和有效载荷了什么的。第一种就是自定义的方式,我自己规定传过来的数据 结构是什么样,从而让你读取到一个序列化好的,你可以通过反序列化拿到对应的数据,然后再返回一个序列化的结果,服务端接收到数据,也能通过反序列化拿到对应的结果。

2025-08-29 21:05:16 874

原创 TCP--执行Linux命令(虚拟xshell)

父子进程有两张描述符表,数据共用,如果有修改就再拷贝,父进程负责监听,但是他不用传输信息,所以它可以关闭通信的sockfd关掉,子进程负责传输,不用监听,所以就可以关闭_listensockfd,这样关闭也不会有什么影响,因为这个和管道的道理一样,进行的是引用计数,所以只要有人用,就不会关闭。但是也可以不管,因为权责分明,自己管理自己的就行。第一个参数协议族--用的是网络通信,就用AF_INET,第二个参数是套接字类型,用的网络协议是TCP的也就是可靠的,连接的,全双工的,面向字节流的。

2025-08-24 19:33:43 649

原创 UDP-字典和聊天室

我们这样多次封装的设计,目的就是解耦以及多态,我们把用户接口设计成抽象类,设计目的就是接口与实现分离,有更好的扩展性,对于用户设计出一个专门的类,如果像qq群里的聊天机器人呢,我又可以继承,设计出新的类(聊天机器人类);增删用户:我们把一个用户对应的IP和端口号,当作用户的识别ID,当有了新用户就增加,用户不在就减去,既然是增加删除,那么这就是把用户管理起来了,所以我们需要一个容器用来描述管理用户,我们这里用的list。第三步 我们作为聊天室里的一个用户,相当于群聊中的一个用户,我们要发送消息和接受消息。

2025-08-20 17:36:30 599

原创 我的创作纪念日

慢慢的也是学会去当做分享什么的,不过有段时间经常没空,就忘了写博客。提示:你过去写得最好的一段代码是什么?一开始呢,其实写博客是老师推荐去写的。我写过最好的代码算是一个封装吧。慢慢进步吧,一点一点。

2025-08-13 23:36:31 160

原创 Socket 套接字的学习--UDP

只是不用手动绑定,而不是没有网络信息。答案是,不要,因为一个公司里的服务器,会有很多的IP地址,我们要给同一个端口发送消息,那么经过不同的IP,同一个端口号,都能给这个进程发送信息,但是如果你绑定了特定的IP,那么只有通过这个IP,才能给这个进程发送消息,所以我们不能绑定IP。其次初始化接口结束后,我们作为服务端,就要等待客户端的一些需求,我们今天的任务是简单的通信交流,所以就是等待客户端的消息,然后收到消息之后就要回话,要知道是谁给我们发的消息,回话的话是给谁发,然后接着等待以后就重复就行了。

2025-08-13 19:04:34 1166

原创 网络基础与套接字的学习

如果用PID,在技术上肯定也是可以找到这个你要找的进程的,但是PID是属于操作系统里面的,如果网络层也用这个,那么系统一旦修改PID,网络层上也要修改,所以为了解耦,简化该复杂的操作,在网络上再用端口号确定一个进程。举个例子,假如是腾讯公司的QQ这个进程,它是广为通用的,而且服务器也是该公司开发,这两个是并用的,所以这个东西是默认确定的,我们并不需要关心,只要想要通信,他就会默认知道。而IP地址地址的作用是标识唯一一台主机,加上端口号的作用就是,确定一台主机下的一个进程,进行数据的传输。

2025-08-11 18:15:15 633

原创 进程地址空间

是否在物理内存中开辟了区域。什么叫分批加载呢,通过进程的优先级,系统会选择优先调度,一些事加载过了,被切换出去了,另外还有没有加载的,未被加载的,先不在物理内存中开辟空间,等到轮到它的时候,在进行开辟,然后更新页表的映射的物理内存地址。地址空间是随着进程一直都存在的,而全局变量这类的数据的虚拟地址一直都在页表里,进程不就是由 页表+地址空间+PCB组成的吗,所有进程在,页表就在,虚拟地址一直都在。,这个代码,在c语言是可以编译通过的,但是你试试一旦运行呢,是不是直接系统就会崩溃,准确的是我们的进程崩溃了。

2024-11-10 02:20:17 1003

原创 Linux的调度算法

这个是我们Linux系统的runqueue,听名字就知道,这个就是调度运行中的程序的,也就是管理进程的一个队列,我们看到红圈里,有个queue[140],这个queue一共有140 个元素,前一百个是其他种类进程应用的,这些进程优先级大于我们要运行的程序,他们会保护电脑的安危,前一百个我们现在不用管,以后学习到了再说,后四十个,四十这个正好和nice的那[-20,19]的取值范围正好对应,就是保存了四十个PCB--task_struct ,都是对进程的描述,也就是每个进程的结构体。这样做的意义是什么?

2024-10-24 02:50:13 1171

原创 进程的学习

父亲的代码是共享给子进程的,父进程相当于给子进程一份拷贝的代码,然后子进程跑子进程的,父进程跑父进程的,相当于两个分支各自进行运行。dash进行命令解释,每个指令都是我们的操作,如果我们只有父进程去执行,那么父进程突然崩溃了,bash是不是也会受到影响,那其他的进程该怎么办。因为父进程对于子进程来说只有一个,而子进程对于父亲来说可以有很多,所以找一个父进程的pid并不难,而找子进程的pid就会有难度,不如直接返回fork,比较方便监控子进程。标示符: 描述本进程的唯一标示符,用来区别其他进程。

2024-10-22 02:28:50 643

原创 OS管理和进程的学习

冯诺依曼这套设计理念,会提高CPU的运行效率,就是怎么说,CPU读取数据的时候,也会进行别的操作,然后边读取也可以别输出,所以并不是需要完全等数据读取完才会进行工作,所以不是单向的提高了速率,而是双向的提高效率,边输入边输出的效率。编写的,所以接口一定和c语言或者c++有关,底层平台的接口都必须和c有关,没有c或者c++,就没有接口,没有接口就不能使用操作系统,不能使用操作系统,就不能使用键盘,鼠标,网卡等地等。但是我们程序员该怎么和OS进行交流呢。输入设备:键盘,鼠标,键盘,网卡(网络接受),磁盘...

2024-10-21 17:23:44 1058

原创 开发工具的继续学习

我们直接复制提示下面的两个操作指令,执行就可以,这样在Linux的学习机器上,我们就创建好了仓库,接着我们上传一个项目。如果你是在你自己仓库外面啊写的项目,你就把文件拷贝到仓库这个目录下面,然后再进行下面操作,一定是再仓库里面进行上传操作。git创建账号,创建仓库什么的,我相信大家都会了已经,然后我们今天在Linux连接上我们的git仓库。而且断点的序号是线性的,删掉了,他的序号也不会覆盖,你再加入一个新的,序号就是3(前面加了两个了),打开个人主页,@后面得就是git的名字,然后输入你的密码就可以了。

2024-10-18 18:39:35 669

原创 Linux的开发工具gcc Makefile gdb的学习

我们发现清理工作是在后面执行的,为什么能让编译器知道先执行编译生成的指令,再是清除的指令呢,从第一行到第一个make结束,然后执行,clean是在后面,如果把clean的指令写在前面,也可以先进行。7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件。

2024-10-18 02:13:20 502

原创 Linux权限的学习

所有者和其他人很好理解,所属组该怎么理解呢,举个例子,小李和小王是一个公司的实习生,两个在不同的分组工作,两个组的工作任务一样,看谁工作中的好,小李写好了,放在了属于他们公司的一个目录文件里面,他设置的权限是只有自己能看,这样小王就不能盗用他的创意了,如果小李的上司想看,该怎么办,如果没有所属组,就只能放开其他人的权限,这样小王又能偷看小李的创意了,后来就有了所属组的概念,对于一部分人能看到,相当于微信朋友圈仅你的好友可见一样。2.普通用户:有对自己文件一定的权限,以及对公共地方的一定权限。

2024-10-13 18:11:31 942

原创 Linux指令学习(二)

追加重定向 如果我们一直往一个文件里echo 就会发现,它会先清空,再写入,如果我们不想让他清空,就可以 内容+>>less与more类似,但使用less可以随意浏览文件,而more仅能向前移动,却不能向后移动,而且less在查看之前。less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极。除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,

2024-09-24 16:12:15 538

原创 Linux 基本指令的学习

举个例子 现在我们在root的路径下,面前有dyx mytest等文件 ,cd +目录或者文件 就可以进去,相当于windows进入文件夹一样,当然我们也可以。2. 当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它。3.同一个文件下,拷贝的和被拷贝的不能一样的名字,因为文件具有唯一性,否则用路径寻找文件其实空谈。指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,:对于目录,该命令列出该目录下的所有子目录与文件。

2024-09-24 01:17:05 1421

原创 继承与多态(多态)

我们在写代码的时候,看到的是不一样的类不同的析构函数,但是c++做了统一处理,编译后析构函数的名称统一处理成destructor,所以只是我们看到函数名字不一样,但实际上也没有改变这个规则,函数名字还是一样的。多态的原理就是,在一个对象中里面存了虚表的指针,然后通过虚表找到虚函数,当然记得是虚表里存的也是虚函数的指针。我们可以看到虚函数是不能实例化出对象的,我们想要通过它调用对应对象的函数,我们需要用到指针的方式。1. 派生类对象d中也有一个虚表指针,d对象由两部分构成,一部分是父类继承下来的成员,虚。

2024-09-14 17:22:26 588

原创 继承与多态的学习:继承

成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),public > protected。4. 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,这段代码可以帮助我们直观的感受到继承,基类(父类)是Person ,每个学生都是人,学生是派生类(子类)如果继承形成这种菱形的感觉,那么我们进行访问的时候,通过访问,不确定是谁的成员。有两种一个是友元函数,一种是友元类,谁是我的朋友,我的朋友就可以访问我的东西。

2024-09-12 17:58:20 845

原创 C++11 的继续学习

这里的Comparepriceless(),这是在干什么呢:sort要接受的是一个函数,而我们现在Comparepriceless是一个类,所以是用它调用operator(),我们此时用的是仿函数,然后用匿名对象调用operator,但是不能用有名对象的operator(),这是因为你()要传参数,它需要的是这样的:这样才能调用到,但是我们仿函数会自动反过来调用。这是我们平常写的,如果学习了c++11的话我们有了新的写法,就是用lambda写 ,比较方便用于多个不同种类的那种,有利之处类似于多态那种感觉。

2024-09-08 23:40:46 1328

原创 c++11的学习

右值的引用它的本质上是左值,为什么呢,就拿移动拷贝来说 我们要举行swap转换,用swap转换各自的资源,右值一般是临时对象,常量,都具有const的性质,如果右值引用本质是右值,那么我们如何用swap来转换资源呢?完美转化:我们用了引用折叠,那么我们再次调用别的函数的时候,就像上面,假如是右值,传参的时候匹配到了左值该怎么办,我们就要用forwar函数,让他自动识别帮助我们传参。2.2 decltype 和auto 有点类似,也可以进行推到数据类型,主要的是将变量的类型声明为。

2024-08-29 13:27:22 904

原创 红黑树的学习

在计算路径黑色结点个数的时候,我们可以检查到红结点的时候,判断它的父亲是不是也是红色,如果从父亲判断孩子的话,有两个孩子,还需要判断空指针问题,不如判断父亲的颜色,因为根是黑色的,不用担心他被访问父亲。如果每次插入是黑色结点,我都得协调每条路径的黑色结点,如果是红色,我只需要考虑,它的父亲是不是红色结点,在进行调色。第一种:叔叔(父亲的兄弟结点,也就是父亲的父亲,它的除了父亲的孩子)存在且为红色结点,那么我们就需要把叔叔和父亲一起调成黑色,接着再往上调整父亲的父亲的结点颜色。旋转就不用再往上改颜色了。

2024-08-21 02:04:41 550

原创 AVL树的学习

就又成为了应该刚才右旋的,因为此时的平衡因子是-2 和-2.总结一下,就是失衡的结点再次成为parent ,然后parent的left要往下转,也就是左旋,然后成为它右孩子的子结点,也就是成为parent->left->right的子结点,正好对应了LR型,然后进行右旋,,也就是形成该样子,把平衡因子为2的14结点向下转,也就是右旋,转成六结点的右孩子,然后6的右孩子,就成了14的左孩子,6的右孩子是空也无妨。我们再代码区域看到了,我已经进行了平衡因子的更新,接下来我们说一下单旋的平衡因子是怎么更新的。

2024-08-18 01:00:58 906

原创 map和set

insert的返回值是一个pai<iterator,bool>,我们可以通过first和second来访问,而且此时的insert是一种搜索功能的,也就是我们插入的时候,会检查有没有重复的,如果有重复的bool值就会成false,没有重复的就插入成功。因为map的【】是用insert进行底层的,所以它的返回值也是一个pair,再通过对pair的解引用就访问到了修改 ,所以我们可以通过对map的第一个key寻找,就能找到了对应的second。

2024-08-16 01:09:23 759

原创 string 的完整介绍

在数组中,我们可以通过[下标]访问数组内容,在c++中,string进行了运算符重载,[]也可以访问string,但是这个运算符重载,多了一项功能,就是帮助我们检查我们访问的下标大不大于我们的sz,就是字符串长度。另外要提一嘴的就是,我们人类的语言与计算机的语言不一样,所以美国发明了ASCLL码表,这样计算机就能我们输入的东西是什么,记着就有各种的字符编码,有unicode,gbk等等,仅作了解。还记得我们数据结构学的串吗,现在在c++中,我们有了c++提供的标准库,它是一个写好的类,非常方便使用。

2024-07-13 22:32:47 1917

原创 c++的模板简单介绍

我们就用栈来举例子,为什么要又类模板呢,加入我们想存int的,又想存double的,我们是不是得创建两个栈啊,所以我们写成模板,这样方便形成。还有一种写法,我们还学过auto,这个就会自动帮助我们推算类型,所以我们写两个类型,去接受,让编译器帮助我们去推算。可是最后一条,这是让编译器怎么计算呢,是转换成double呢还是int呢,这时候我们的实例化就要起作用了,告诉编译器我们需要的推算类型。我们来简单举个例子。就是Swap函数的例子,相信大家已经对这个已经不陌生了,我们用模板的方式来写一下。

2024-07-04 01:41:28 451

原创 c++内存管理

new(aa1)A 这句代码是什么呢,这就是调用构造函数,就像上边我们画的图那样,需要调用构造函数,但是构造函数不能像析构函数那样显示调用,c++的写法就是new(地址)类型(含参构造)隐式类型转换.aa1调用析构函数给它里面申请的空间释放了,然后再用 operator new来释放aa1。这里需要注意的是,“abcd”刚才我们不是说了在代码段吗,现在怎么在栈上了,原因是将常量区的数据拷贝了一份,放在了栈上,也就是char2刚才在栈开辟的空间。a是属于栈上的,它属于具有变量,abcd是在代码段的。

2024-07-03 02:37:42 663

原创 类与对象完结

我们这么定义匿名对象,匿名对象的特点不用取名字, 但是他的生命周期只有这一行,我们可以看到下一行他就会自动调用析构函数。aa1就是就是有名类,如果我们直接给一个类进行构造就是匿名类。

2024-07-02 21:25:39 252

原创 类与对象(4)

此时我们看一下对类A的一些操作,前两个没什么好说的,第三个我们看,直接把3给A了,int给自定义类型,这是什么情况,其实这是隐式类型的转换。当 _scount是静态区的成员时,不在类的里面,当我们每个类的创建时候都会进行调用构造函数或者拷贝构造函数,所以我们只要知道_scount的值就会知道有多个类。第四个是因为,隐式类型转换的时候具有常性(类型转换就有临时对象的产生,比如double转int),所以引用的时候,权限不可以放大,要加const。如果C是B的友元, B是A的友元,则不能说明C时A的友元。

2024-07-02 01:07:26 439

原创 类与对象(3)

值得注意的是我们的+=用的引用返回,但是+用的就是传值返回,+=的对象一直在类里面没有因为+=函数结束而销毁,所以用引用返回没问题,但是我们+用的是一个局部变量,会销毁,但是如果传值返回我们会形成一个临时对象的拷贝,所以我们防止计算出的结果的销毁,用传值返回,保证值的成功返回。其次我们看下面这个,为什么返回这个可以呢,因为传值返回是返回 它的拷贝的临时对象,就是d要先调用一下拷贝构造,然后接着呢,再把拷贝好的临时对象返回去,然后函数结束,析构函数释放d。拷贝构造是给一个没有赋值的对象进行拷贝赋值。

2024-07-02 00:03:20 984

原创 对类与对象的(二)补充

内部有指针或者一些值指向资源的,就要写析构释放,写拷贝构造完成深拷贝的。如Stack Queue。值得注意的是 无参的构造并不是没有参数,而是不用参数传参就可以构造的函数就是无参构造。默认构造函数有三种 :全缺省的构造函数 无参的构造函数 和编译器默认生成的构造函数。除非像两个栈是实现一个队列的情况,都是自定义类型,可以不用再对队列写一个构造函数。2.一般情况的构造函数都得自己完成 因为编译器对内置类型不做处理。1.Date这样的构造函数 析构函数 拷贝构造。,一般不用写析构的,就不用写拷贝构造。

2024-06-26 16:41:42 265

原创 类与对象(1)

比如:入学时填写的学生信息表,表格就可以看成是一个。也可以声明放在.h文件里,然后在.cpp文件里写定义。public修饰的成员在类外可以直接被访问。一样的东西,限定了类有哪些成员,定义出一个类。如果后面没有访问限定符,作用域就到。注意:在继承和模板参数列表位置,修饰的成员在类外不能直接被访问。,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用。一个类可以实例化出多个对象,类,来描述具体学生信息。之前在数据结构初阶中,用。可以当成结构体使用。定义类是一样的,区别是。定义的类默认访问权限是。

2024-06-26 16:29:59 293

原创 类与对象(2)

我们给s2进行拷贝构造的时候,我们其实是先给d进行一个拷贝,把s1先拷给d,因为函数栈帧上我们知道,传值调用的时候形参和实参并不是一块空间,把实参的内容拷贝到形参。如果我们用的是引用,调用拷贝函数的时候,第一次就是s1的实参,直接就可以使用,把s1的实参直接拷贝给d,d再给s2使用。.两种情况不用写:a.无资源清理的 b.内置类型成员没有资源需要清理的,剩下的都是自定义的成员,如MyQueue,就是用栈实现队列,栈里面自己写了,就可以自己调用.编译器会自动生成一个无参的默认构造函数,一旦。

2024-05-10 16:08:33 655

原创 继续学习排序

大家可以看到我们以每个的数字作为下标,然后把tmp数组中下标是arr里面数字的位置进行增加,只要遍历tmp数组然后把不为零的地方进行操作,它的下标就是这个之前数组的数,这个下标的数就是代表这个数有几次,然后遍历这个新数组,从下标零开始,那样的话不就把顺序也排好了。那么我们可以在这堆数字里找出一个最小值,每个数组的数组减去最小值,成为下标,那么空间浪费就会很少。这个排序适用于数组范围比较集中的,因为我们把数组里面的数作为新数组的下标,这样我们就可以记录这个数出现的次数,大家看代码把,应该会比较清楚。

2024-04-23 18:02:20 217

原创 学习一下选择排序,快速排序

那么right找的是什么,找的是比key小的数字,它停下的地方就是比key小的地方,所以left向右走,碰到的时候,key绝对要比相遇的大。通过动图我们可以直到快速排序的原理是,以左下角的数为key,然后右边的指针先走,right去找比key小的数,left再走,去找比key大的数,然后两个数进行交换,然后right再往左走,left再走,直到左右相遇,也就是left==right了,最后一步把key和left和right相遇的位置进行交换。并且,他们相遇的地方。为什么,相遇的地方一定比key小呢?

2024-04-17 16:45:46 465

原创 学习几道树的题

如果我们开始遍历root,当root一个结点的值和我们subRoot 这个树的根结点相同的时候,那么我们就把root的结点和subRoot的结点传递给isSameTree刚才那道题写的函数中,这样的话,那我们说一下遍历root的思路。开始遍历,也就是root到空指针的时候,subRoot也得是空,否则就肯定不是一样的树了,当然左子树和右子树都不一致才能这么说。首先我们在树的学习中,遍历树,遇到空就要结束返回,这是肯定的,我们遍历到了两棵树的结点,如果一棵树的结点已经是空了,而另一棵树不是空,那肯定不相同。

2024-04-16 18:29:31 324

原创 学习部分排序,插入排序,冒泡排序以及希尔排序

我们要把6进行前面的插入,那我们要进行比较,首先确定一个end的指针,然后他指向的数字就是我们需要比较的,如果end指向的数比我们end+1 的大的话,那我们就往前挪一个,让end指向的数位置换到刚才end+1 的位置,也就是6的位置。那么end就是在有序数组的最后一个,然后把end+1的位置存进tmp,如果比较成立,end的数字向后移动,覆盖end+1位置的数,当如果是逆序排列,end就会到达-1的位置,那么遍历也就结束了,这也成为了我们while的判断条件。间隙越大,换的越快,越不接近有序数组。

2024-04-15 17:04:05 567 2

原创 循环队列的实现

我们想想如何实现队列的功能呢,队列的原则是先进先出,那么我们就需要一个指针一直在队列的头帮助我们获取结点,出队列的时候就让front向后移动。我们只要控制好队列的长度,下标每次增加的时候%一下就会控制在0~这个范围。首先我们要画图,我们要知道队列是像单链表那样用地址链接起来的。但是我们观察这道题,队列的长度是一定的,并且要循环,那这样的话我们不如使用数组的方式来进行实现。rear是尾把我们使他每次都指向最后一个元素的下标的下一个,这样我们添加的时候直接插入该下标再++,当然你也可以选择先++再插入。

2024-04-13 10:54:59 586 1

原创 队列和栈的相互实现

我们由图可以看出,如果插入一些元素之后,我们获取栈顶元素就是最后队列的最后一个元素,那我们是不是就可以把队列一的内容一个一个移动,这样直到队列只剩下一个元素之时,我们此时获得的队列元素就是栈顶的元素,如果我们再次插入5 6,那我们是插入队列一还是队列二呢,如果我们插入队列二,如何获得栈顶元素六呢?在我们最开始往进插入的时候,随便插入,一直插入那个不为空的队列,只要保证一个空,一个不为空就可以了。我们想想该如何查此时的栈还有没元素,两个队列全是空的肯定是空,只有一个队列有元素,那栈就不为空。

2024-04-10 17:37:03 610 1

原创 继续学习堆

建立的是大堆,那我们的堆顶就是最大的元素,既然最大的我们有了,加上我们之前学过一次如何删掉堆顶元素,所以我们建设大堆,接着交换堆顶和堆尾,像删掉堆顶那样,再进行不加入刚才最大元素,重新排列,找出此时的堆的最大元素,然后再交换。假如我们使用建设小堆的原理来排序,那么堆顶一定是最小的元素,剩下的按照左子树比右子树小的原则进行排列,但不一定是我们要的升序。冒泡排序时间复杂度是O( n^2 ),n是一万还好,如果是n是一亿甚至更大呢,那时间将非常大,所以我们将用堆实现一种更快的。今天我们来学习一下对 堆的排序。

2024-03-31 14:32:54 586 1

空空如也

空空如也

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

TA关注的人

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