自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 1.2 操作系统的发展与分类

2024-05-20 00:00:08 421

原创 1.1 操作系统的作用与特征

2024-05-19 23:57:01 113

原创 3. 数据链路层(1)

数据链路层在物理层提供服务的基础上向网络层提供服务,其,使之对网络层传输为一条的链路。

2023-07-22 13:46:35 195

原创 2.物理层

例如,在采用粗同轴电缆的 10BASE5 以太网规范中,互联网串联的中继器的个数不能超过 4 个,而且 4 个中继器串联的 5 段通信介质中只有 3 段可以挂接计算机,其余两段只能用作扩展通信范围的链路段,而不能挂接计算机。式中,W为信道的带宽,S为信道所传输信号的平均功率,N为信道内部的高斯噪声功率。S/N为信噪比,即信号的平均功率与噪声的平均功率之比,信噪比=10log10(S/N)(单位为dB),例如,当S/N=10时,信噪比为10dB,当S/N=1000时,信噪比为30dB。

2023-07-21 16:38:20 440

原创 2.数据的表示和运算

权值由高到低分别为2,4,2,1,特点是大于或等于 5 的 4 位的二进制数中最高位为 1 ,小于 5 的最高位为 0。其整数部分,从小数点往左数,将一串二进制数分为 3 位一组(转八进制)或 4 位一组(转十六进制),不够 3 位或 4 位,变形补码,又称模 4 补码,双符号位的补码小数。若字长为n+1,则补码的表示范围为 -2^n

2023-07-18 12:22:01 626

原创 1.计算机网络体系结构

结点A向结点B传输一个分组时,既可以经过acg,也可以经过b、h,有很多条可以选择的路由,而网络层的作用就是根据网络的情况,利用相应的路由算法计算出一条合适的路径,使这个分组可以顺利到达结点B。在两个相邻结点之间传送数据时,由于两个结点性能的不同,可能结电A发送数据的速率会比结点B接受数据的速率快,如果不加以控制,那么结点B就会丢弃很多来不及接收的正确数据,造成传输速率的下降。因为用户的实际应用多种多样,这就要求应用层采用不同的应用协议来解决不同类型的应用要求,因此应用层是最复杂的一层,使用的协议也最多。

2023-07-17 18:59:15 664

原创 1.计算机系统概述

将PC的内容送到MAR,MAR中的内容直接送到地址线,同时控制器将读信号送读/写信号线,主存根据地址线上的地址和读信号,从指定存储单元读出指令,送到数据线上,MDR从数据线接收指令信息,并传送到IR中。将IR中指令的地址码送MAR,MAR中的内容送地址线,同时控制器将读信号送读/写控制线,从主存中取出操作数,并通过数据线送至MDR,再传送到ACC中。控制器根据IR中指令的操作码,生成相应的控制信号,送到不同的执行部件,例如,IR中是取数指令,因此读控制信号被送到总线的控制线上。

2023-07-16 20:54:20 324

原创 C++ 多态详解附图与代码

上面代码Student继承了Person,Person中声明了买票的虚函数,当Student完成了对它的重写之后,子类中存储的虚表就发生了变化。派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。,重写意为只继承了父类的函数名参数返回值,然后把函数的实现给重写了, 而覆盖在原理层指明了是将虚函数表给覆盖了,没有完成重写也就不会覆盖。p如果指向父类,就会到父类的虚函数表中去找,找到的就是父类的虚函数。

2023-07-01 16:42:39 407

原创 C++ 哈希详解

具体来说,当使用直接定址法时,我们可以通过一个固定的偏移量或者一个简单的数学运算来计算输入值对应的哈希表位置。然而,拉链法也存在一些缺点。在使用拉链法时,通过哈希函数计算键的哈希值,并访问对应的槽。总之,拉链法是一种解决哈希冲突的方法,通过在哈希表的每个槽中存储一个链表来保存具有相同哈希值的键值对。无论是哪种探测方法,在哈希表逐渐接近满的过程中,插入数据的效率会越来越低,因此闭散列哈希表不能满了再增容。进行同样的计算,把求得的函数值当做元素的存储位置,在节后中按此位置取元素比较,若关键码相等,则搜索成功。

2023-06-28 17:07:17 2164

原创 C++ 模板详解附代码

比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对字符类型也是如此。别看这只是简化了两组代码,想想对于stack的实现,我们总不可能写一个int类型的,再写一个double类型,再写一个char类型的吧,使用上模板就大大优化了代码。通过使用类型特化和非类型特化,我们可以为不同的类型参数或非类型参数提供特定的行为,满足特定需求,并在代码中获得更好的性能和效果。类型参数指的是在模板中使用的类型占位符。

2023-06-27 10:52:03 217

原创 C++ 内存管理

而 malloc 函数在 C 中更常用,只是简单地分配内存,需要手动管理内存的分配和释放,并且不提供对象构造和析构的自动调用。忘记或错误地使用delete[]释放new分配的单个对象的内存,或使用delete释放new分配的数组对象的内存,都会导致未定义的行为。已经分配的内存块的大小。而使用 malloc 则需要手动指定所需的字节数,并且返回的是 void* 类型的指针,需要进行显式的类型转换。而使用 free 函数释放 malloc 分配的内存时,不会调用对象的析构函数,只是简单地释放内存。

2023-06-26 19:44:18 273

原创 C++ 匿名对象

(2) 匿名对象也可以有自己的构造函数、析构函数和成员函数,它们的行为与具名对象一样。它们通常用于在单个语句中执行一系列操作或调用某个函数,并且不需要将其结果存储到变量中。因此,无法在后续的代码中再次引用该对象。有时候我们只需对某个对象进行一次操作,这时可以使用匿名对象来创建临时的中间结果。当你调用某个函数时,可以直接使用匿名对象作为该函数的参数。它们常用于函数调用、链式调用和临时对象的场景。匿名对象的创建非常简单,只需在类名后面使用一对空括号。匿名对象是在没有被命名的情况下创建的临时对象。

2023-06-24 14:15:36 1715 1

原创 C++ 详解友元函数

友元类(Friend Class)是C++中的另一个重要概念,它允许一个类将另一个类声明为自己的友元,从而使得被声明为友元的类可以访问该类的私有成员。比如在只声明B是A友元的情况下,B可以访问A的私有成员,但是A却不可以访问B的私有成员,即A不是B的友元。友元函数提供了一种在需要时访问类的私有成员的机制,但应该慎重使用,因为过多的友元函数可能破坏类的封装性。(1)友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。:如果B是A的友元,C是B的友元,则不能说明C是A的友元。

2023-06-24 12:18:42 3586

原创 C++ static成员

静态成员在所有类对象之间共享,并且可以直接通过类名访问,而不需要创建类的实例。静态数据成员用于在类中存储共享的数据,而静态成员函数用于实现与类相关的功能。通过正确使用静态成员,我们可以避免重复存储和管理相同的数据,并提供更高效的类访问方式。(1) 静态成员只有一个拷贝,它不属于某个具体的实例,而是属于整个类,在类的所有实例之间共享使用。(3) 类静态成员即可用类名::静态成员或者对象.静态成员来访问。(成员变量+成员函数),但是非静态成员可以访问静态成员。,我们可以直接调用并使用静态成员函数。

2023-06-24 11:32:29 128

原创 C++ 运算符重载

C++中的运算符重载(Operator Overloading)是一种特性,它允许我们重新定义已有的运算符(如加号、减号、乘号等)的操作行为,使其适用于自定义的类类型或用户定义的数据类型。通过重载运算符,我们可以使用自定义的语义来执行运算符操作,使得代码更直观、可读性更好,同时也提供了类似内置类型的操作方式。(4) 作为类成员的函数重载时,其形参看起来比操作数数目少1个成员函数的操作符有一个默认的形参this,限定为第一个形参。是否要重载一个运算符,看的是这个运算符是否对这个类的对象有意义。

2023-06-24 10:25:53 84

原创 C++ 详解构造函数&析构函数&拷贝构造

(4) 如果类中没有显式定义构造函数,则C++编译器会自动生成默认构造函数,一旦自己定义了显式构造函数,编译器将不再生成。一般涉及到动态内存开辟的,我们都需要自己实现析构函数,以便在对象的生命周期结束时,完成对空间的释放,资源的清理。在C++中,拷贝构造函数(Copy Constructor)是一种特殊的构造函数,用于创建对象的副本。与构造函数功能相反,析构函数不是完成对象销毁的,对象在销毁是会自动调用析构函数,完成类的一些。当一个对象以值传递的方式传递给函数时,会调用拷贝构造函数创建函数中的局部对象。

2023-06-24 00:19:08 450

原创 C++ 类和对象详解

将类中的部分成员声明为protected或者private,那么外界只能通过类中的公有部分来访问或修改数据成员,这种方式有效地隐藏了对象内部的实现细节,避免了外界的非法访问与操作,便于维护与重构。下面我们定义一个Student类,其中class为定义类的关键字,Student为类的名字,{}内为类的主体部分,类定义结束后面要有分号。,因为类可以看作一个模板,其实用它定义出来了许多对象,那些对象也只是成员变量不同,而成员函数都是相同的,所以会存放在一段公共的函数代码段。五、类的实例化与隐含的this指针。

2023-06-09 21:17:13 149

原创 C++11 范围for详解

范围for的迭代范围必须是确定的,对于数组而言,就是数组中第一个元素和最后一个元素的范围。C++11新标准引入了一种更简单的for语句,这种语句可以遍历容器或其它序列的所有元素。冒号右边:序列类型的特点是拥有能返回迭代器的begin()和end()成员。e是一个形参,每次循环e都会取array中的一个元素,并自动++。冒号左边:定义的一个变量,序列中每个元素都能转换成该变量的类型。范围for的本质是迭代器,凡是支持迭代器就能使用范围for。一、范围for 的定义。二、范围for的使用。

2023-06-04 13:40:21 456

原创 C++ auto类型说明符详解

C++11新标准引入了auto类型说明符,用它可以让编译器替我们去分析表达式所属的类型,由于auto会让编译器根据初始值来推演变量的类型,所以。2.对于含有const的类型,会忽略顶层const属性(一般赋值时),而保留底层const属性(如指针和引用,因为涉及到了修改原对象)。原本需要写一大长串的类型,这里我们可以用auto来直接推导,简化了许多代码。编译器推导出来的auto类型有时候会和初始值的类型并不完全一样,编译器会适当的改变结果类型是其更符合初始化规则。auto定义的变量必须有初始值。

2023-06-04 13:18:04 478

原创 C++ 内联函数详解

内联函数是C++为提高程序运行速度的一项改进,编译的最终产品是一个可执行程序(.exe文件),它由及其语言组成,我们写的每一句代码都会对应一部分的及其语言指令。对于常规函数来说,当计算机执行到函数的时候,程序执行会跳到函数指令的地址,并在函数结束的时候返回,这种来回跳跃的行为会有一定的开销。而C++内联函数提供了另一种选择,在调用函数的时候编译器将使用函数代码替换函数调用,因此,程序也就无需跳到另一处位置执行代码,然后再跳回来。所以,内联函数的运行速度比常规函数稍快,但是却占用了更多的内存,这是一种。

2023-06-04 11:54:07 481

原创 C++ 引用详解附代码

常规变量(比如上面的a)和 const 变量(比如上面的b) 都可视为左值,因为可通过地址访问他们,它们是在内存中确确实实的开了空间的。这里b是a的引用,也就是说,我们给a起了另一个名字——b,因此不同于赋值,a和b是同一个对象的不同名称。c出了Add函数之后就不存在了,所占用的空间也已经还给了操作系统,再返回c的引用就失去了原本的意义。总结:一个函数要使用引用返回,返回变量出了这个函数的作用域还在,就可以使用引用返回,否则就不安全。,变量a的地址是在它定义时系统随机分配的,但b不是,b的地址是。

2023-06-02 22:49:51 495

原创 C++ 函数重载

函数重载可以一定程度上减轻我们起名字的负担,但是不同的函数名字反而可以使得我们更好的记忆函数的功能(顾名思义)。因此,一般来说我们是否后使用函数重载还是要看怎样更容易理解记忆。至少其中一个不同,这也是对函数进行重载需要遵循的。注意:仅仅靠返回类型不同不能构成函数重载。参数列表不同体现在:函数参数的。中存在的几个函数,如果它们。,我们称之为函数重载。

2023-06-02 17:30:55 54

原创 C++ 缺省参数

简单来说缺省参数就是函数的默认参数,如果我们传参数,那么就使用我们传的参数,如果不传参数,就使用默认参数。顾名思义,全缺省就是函数的每个形参都有其默认值。半缺省函数缺省部分参数,但必须从右往左连续缺省。半缺省没有缺省参数的位置必须的传参数。缺省参数分为全缺省和半缺省。

2023-06-02 16:00:34 113

原创 C++ 命名空间

注:cin是istream类型的对象,也被称为标准输入;cout是ostream类型的对象,也被称为标准输出。指令,这样在使用命名空间时就不用再单独声明,编译器会认为后序代码,都将使用指定命名空间中的内容。我们可以注意到,上面声明的方式显得有些繁琐,这里我们可以借助一种更简单的声明途径——没有提前声明cout,所以使用cout仍然需要单独声明。3.using namespcae声明全部。来定义命名空间,后面跟空间的名称。2.使用using声明一类。

2023-06-02 15:38:27 46

原创 C++ 简单实现一棵AVLTree 附图解

二叉搜索树的出现使得存储数据的同时方便进行高效搜索(因为在此之前的数据结构基本都是暴力搜索),而二叉搜索树的时间复杂度为O(log2 N),但二叉搜索树还是有缺陷的,如在极端情况下(比如有序的方式进行插入),二叉搜索树就会退化成单链形式,时间复杂度变为O(N)效率低下。正因如此,才出现了AVLTree。

2023-05-03 15:00:15 73

原创 【LeetCode】102.二叉树的层序遍历

size记录的是该层节点的个数,vec将每一层节点放进去,最后一层while循环结束后,再将vec放入其中。我们可以借用队列先进先出的特性,将各层节点入到队列中去,每出一个节点,将其左右节点带入。队列中存的是二叉树节点的地址,出队列不会销毁二叉树的节点。

2023-04-15 12:27:45 70

原创 【LeetCode】606.根据二叉树创建字符串

使用二叉树的中序遍历,需要注意的是当左节点为空,右节点不为空的时候要加上()。

2023-04-15 11:28:59 49

原创 C++ 简单实现一棵二叉搜索树(递归版本与非递归版本)附代码

二叉搜索树(Binary Search Tree, 简称BST)是一种非常常用的数据结构,它是一种节点具有左右子树,它的每个节点都满足左子树所有节点小于当前节点,右子树所有节点大于当前节点。使用“V模板”可以帮助我们方便地对节点的值进行读取和修改,也可以实现一些高级操作,例如计算BST中各个节点之间的关系等。,因为我们可以通过比较节点的键值来确定需要访问的子树,这个有点类似于数组中的下标。模板K:记录当前节点的值,可以帮助我们。方便地进行节点的查找、插入和删除等操作。模板V:我们可以将“V模板”应用到。

2023-04-15 11:10:15 134

原创 C++ 继承(基类与派生类)详解附代码

继承是C++语言的三大特性之一,通过继承联系在一起的类构成一种层次关系。通常在层次关系的根部有一个基类,其他类则直接或间接地从基类继承而来,这些继承得到的类称为派生类。继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类型特性的基础上进行扩展,增加功能。一、继承的实例演示继承的三种方式继承的方式有三种:公有继承、私有继承、保护继承基类的private成员在派生类中不可见,如上述例子中Person中的_age成员在派生类Student中不可见。

2023-04-10 22:51:59 4210 1

原创 【LeetCode】20.有效的括号

括号匹配问题,利用栈的特性,遇到左括号如‘(’,‘[’‘{’,将对应的右括号入栈,要出栈的数据一定与栈顶数据匹配(如对于上面一定是‘}’,‘]’,‘)’),不匹配就不是有效的括号。

2023-04-09 10:03:26 70

原创 【LeetCode】225.用队列实现栈 (C++,附优化版本代码)

我们仍然拿1,2,3,4,5举例,先将他它们入到pushq中去,这时候由于是模拟栈,我们想出的数据顺序是5,4,3,2,1,所以我们每次出数据是,只在pushq中留下最后一个元素,其余元素转移到popq中去。如果理解了用两个队列实现,那么不难发现,其实备用栈是可以省略掉的,我们直接将队列中最后一个元素前面的元素入到队列后面就可以了。用两个队列实现栈,其中一个队列用来存放数据,另一个队列是备用的。然后我们再交换一下pushq与popq。

2023-04-07 20:02:23 122

原创 【LeetCode】232. 用栈实现队列

popST负责出数据,这样我们入数据顺序是1,2, 3, 4, 5,出数据顺序也是1,2,3,4,5,看起来如同队列一般。示例:1, 2, 3, 4, 5,我们将其入到pushST中。用两个栈实现一个队列,入栈负责入数据,出栈负责出数据。出数据时,我们将pushST中的数据入到popST中去。

2023-04-07 19:25:50 51

原创 C++ 优先级队列(priority_queue)

priority_queue也是queue,所以其只允许在队头出数据,在队尾入数据,priority使得该队列有了权值的概念,priority_queue会对入到其内的元素按照元素权值进行排列。我们已经知道了可以使用仿函数来改变priority_queue的优先级,具体是如何做到的的,我们可以通过实现一个priority_queue来更深入的了解它。然后我们再单独介绍一下里面使用到的仿函数。如果想变成小的优先级高,该怎么办呢?---可以使用仿函数。剩下的函数就好理解了。

2023-04-07 00:09:00 231

原创 C++ stl栈与队列及实现方法

而deque的出现同时解决了两者的缺点,相比于vector,deque允许在常数时间内进行头插和头删操作,而且deque没有容量的概念,它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来,因此像vector扩容时释放旧空间,开辟新空间再拷贝元素的损耗问题就被解决了。默认情况下,stack和queue是基于deque实现的,我们上面提到了用vector来实现一个stack,用list来实现一个queue,但是这样有显而易见的缺点。用list来实现一个queue。介绍stack以下几种功能。

2023-04-06 21:09:18 180

原创 【LeetCode】142. 环形链表 II

意思就是x的距离等于从相遇位置再走z+(n-1)圈,从相遇位置开始走,走过的路程为z+(n-1)圈后与从初识位置开始走的指针相遇,相遇位置再环形入口。所以我们记录index1为初识位置,index2为相遇位置,两个指针一起走,当两者相遇时的位置就是环形入口。fast走过的路程:x+y+n(y+z),即fast不仅走了个x+y还多走了n圈(n至少为1)可以思考一下当fast每次走n步(n>2),slow每次走1步,两者是否还能相遇,为什么?n=2时,x=z+1(y+z);n=3时,x=z+2(y+z)

2023-04-01 16:14:29 92

原创 【LeetCode】面试题 02.07. 链表相交

如果两个链表不等长,我们先遍历两个链表,计算出它们的长度以及较长链表比较短链表多出来的长度gap,然后让较长链表的指针先走多出来的长度步,接着两个链表的指针同时向后遍历,直到找到它们的第一个公共节点。简化下问题,如果两个链表等长,那么我们只需要同时遍历两个链表,比较每个节点的地址是否相同就可以。如果没有公共节点,则返回 null。当然两者的思路可以合并。

2023-04-01 14:56:37 167

原创 【LeetCode】19. 删除链表的倒数第 N 个结点

起初,慢指针slow和快指针fast都指向虚拟头结点dummy,然后,我们让快指针先走n个节点。接着让快指针和慢指针一起走,直到快指针指向尾节点,这时候慢指针的下一个位置就是要被删除的节点。由于单链表不能倒着遍历,这里我们借助快慢指针来找到链表的倒数第n个节点位置。由于可能涉及头结点的删除,这里我们还是使用上虚拟头结点。

2023-03-31 16:13:22 75

原创 【LeetCode】24.两两交换链表中的节点

然后,我们用 cur 指针遍历链表,每次将 cur 指针后移两个位置(按交换前算),进行相邻节点的交换操作,交换时,prev->next = next,cur->next = next->next,next->next = cur。初始时,prev代表代表虚拟头结点,cur表示头结点,next表示头结点的下一个节点。题目要求两两节点进行交换,所以如果是1个节点就不交换,如果是3个节点就交换前两个,总之构不成一对的节点的就不交换。

2023-03-31 15:28:24 45

原创 【LeetCode】206.翻转链表

用cur来遍历原链表,再不断更新newhead,newhead从nullptr到1。reverse中cur用来遍历链表,cur为空返回newhead。用tmp记录下cur->next,那么cur就成了newhead。最容易想到的是遍历链表,依次将其反向,即迭代法。递归法跟迭代法的逻辑是一样的,如下面解释。

2023-03-31 14:14:11 43

原创 【LeetCode】707.设计链表

首先,我们需要定义一个结构体 LinkedNode,表示链表的节点。该结构体包含两个成员变量:val 表示节点的值,next 表示指向下一个节点的指针。然后,我们在类中定义一个私有变量 _dummyHead,表示链表的虚拟头结点,并初始化为 nullptr。同时,我们还定义一个私有变量 _size,表示链表中节点的数量,并初始化为 0。在各个操作函数中,我们需要事先做一些判断,本题中各个函数也给出了相应的提示;addAtIndex():在链表第index个节点前面插入一个节点。本题考察了链表的常用操作。

2023-03-31 12:54:29 160

空空如也

空空如也

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

TA关注的人

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