自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java——多态

在父类的构造方法中是可以调用子类的重写方法的,但是由于子类初始化在父类之后,所以会产生问题,不建议这样使用。通过以上的介绍,可以为多态下一个定义了,多态就是对不同对象尽管看似调用了同一种方法,但是由于对象是向上转型的,方法是存在重写的,所以相当于父类对象调用了不同的子类的重写的方法,因此形成了多态。

2024-04-19 00:55:27 733 1

原创 Java——继承

编译器所加的是super()无参构造方法,这就说明。

2024-04-17 00:15:44 715

原创 Java——类和对象

在java中对于类的创建使用class关键字,其中包含成员变量和成员方法。//创建一个Book类//成员变量(属性)//成员方法(行为)System.out.println("读书");可以在IDEA中右键src进行新建包,包名以.作为分割符,即 xlz.pack.l4 为 xlz\pack\l4。然后就可以在这个包下新建输入这个包的类文件了,在包中的java文件会在最上方加上一个package语句指出在哪个包中。

2024-04-15 18:05:57 1043

原创 Java——数据类型、运算符、逻辑控制、方法、数组

Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

2024-04-07 20:44:09 972

原创 C++——STL容器——string

在C语言中我们在处理字符串时采取的方案是使用一个字符数组,这样的方式对于我们管理和使用字符串会有一些麻烦。所以在C++中,一方面兼容了C语言中的字符串形式,另一方面则是通过内置的string类来进行管理。C++内置的string类配备了许多方便的成员函数,这对我们使用C++处理字符串提供了极大的便利,这篇文章主要是总结string类的使用方法以及一些特点,同时对于一些常用的函数我们会自主模拟一份,以帮助我们更细致地掌握细节。

2024-04-06 14:37:33 949

原创 C++——内存管理、模板

C++对动态开辟内存的方式使用new和delete操作符来对堆空间进行空间管理

2024-03-10 18:19:58 903

原创 C++——类和对象(5):static成员、友元、内部类、匿名对象

在类中可以使用static来修饰成员变量或者成员函数,使之成为静态成员变量或者静态成员函数。。在类中声明,在类外定义(定义时注意类的域限定符)。没有this指针,所以可以不通过实例化后的对象进行调用,但是只能访问类中的静态成员。静态成员依旧收到访问限定符的限制。

2024-03-08 00:20:19 815

原创 C++——类和对象(4):取地址及const取地址操作符重载、初始化列表

且在初始化列表每个成员变量只能出现一次(只能定义并初始化一次)。在。

2024-03-08 00:17:41 950

原创 C++——类和对象(3):运算符重载、日期类

所以如果成员变量存在申请资源的,需要自己写出深拷贝以避免出错。⑤与拷贝构造函数进行一个区分,拷贝构造函数用在初始化,而赋值运算符重载用在使用的过程中进行赋值操作的过程。

2024-03-01 13:32:45 578

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

我们将什么成员都没有的类称为空类,但是空类中并不是什么都没有。任何类中都会存在6个默认成员函数,这6个默认成员函数如果用户没有实现,则会由编译器默认生成。 6个默认成员函数包括:负责初始化工作的构造函数;负责清理工作的析构函数;在用同类对象对创建对象进行初始化时用到的拷贝构造;用于对象之间赋值的赋值操作符重载;还有两个很少自己实现的取地址操作符重载和const修饰的取地址操作符重载。 构造函数是一个特殊的成员函数,帮助我们对新创建的对象进行初始化。构造函数说明

2024-02-27 22:24:11 974

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

声明和定义同时放在类体中,这种方式比较简便,就像C语言阶段的声明定义不分离一样。int _month;int _day;这种方法类似于C语言中的声明和变量分离,比较规整并且便于合作开发。这种方法需要注意类的作用域,即需要 类名::成员名 来指明成员所属的类域。int _month;int _day;date.cpp。

2024-02-25 16:21:37 1028

原创 C++——基础语法(3):内联函数、auto关键字、基于范围的for循环、空指针nullptr

在函数前加入inline修饰即可将函数变为内联函数。所谓内联函数,就是在编译时C++编译器会将函数体在调用内联函数的地方展开,从而省去了调用函数的栈帧开销,提高程序运行效率。对上述代码,在Debug版本下,我们观察汇编代码,发现仍然调用了函数Add而不是我们希望的内联展开形式。这是因为内联函数展开后就不可调试了,而Debug版本为了方便我们调试,因此忽略了inline的选项。为了可以看到内联函数的变化,我们可以做出如下设定,再在X86环境下编译程序,这样Debug版本也可以实现内联了。

2024-02-24 21:35:14 534

原创 C++——基础语法(2):函数重载、引用

4. 函数重载 函数重载就是同一个函数名可以重复被定义,即允许定义相同函数名的函数。但是相同名字的函数怎么在使用的时候进行区分呢?所以同一个函数名的函数之间肯定是要存在不同点的,除了函数名外,还有返回类型和参数两部分可以视为函数的特征。 以返回类型来区别,因为在函数调用时不能显式地指出函数返回类型,所以难以使用返回类型来区别。因此只剩下了参数来区分,我们可以总结出以下三种常见的函数重载的情况:①参数个数不相同:void func(int a, int b){

2024-02-24 00:58:59 891

原创 C++——基础语法(1):命名空间、输入输出、缺省参数

命名空间的定义使用关键字namespace,然后接命名空间的名字,然后使用{}包含所有命名空间的成员。需要注意:①命名空间中可以定义变量、函数、类型;②命名空间可以嵌套定义;③如果定义了相同名称的命名空间,编译器会将其合并为一个。//命名空间的定义//命名空间内可以定义变量、函数、类型,也可以嵌套其他命名空间int a = 9;int val;int a = 8;char c;//相同名称的命名空间最后会被编译器合并成为一个int b;

2024-02-22 17:42:26 723

原创 排序(6)——冒泡排序、计数排序

计数排序给我的感觉就是众多排序算法中的民间高手。虽然方法不入流,适用范围不广,但是架不住它真的快。排序算法简单说就是统计所有数据出现的次数,然后根据统计的次数从小到大再将数据依次输出。说它不入流是因为我感觉计数排序并非真正的排序,这种统计次数再输出的方式并不是对于原数组进行数据的处理,这也就注定了它的适用范围并不会很广。计数排序只能用于数据跨度较小的整数排序上。

2024-02-03 12:32:21 752

原创 排序(5)——归并排序

归并排序也是一种很经典的排序算法,采用分治的思想方法进行数据的处理。归并讲究的是先拆后合,也就是分治中的分而治之。在拿到一组数据后,程序会将整个数据进行不断拆分直至有序,因为单个元素必然有序,所以归并排序最后拆分形成的组每组只有一个元素。对于这些已经有序的组别,再进行治,就是合并两个有序序列。如此采取先分再合的策略使得一组数据最后成为有序。

2024-02-02 15:50:36 947

原创 排序(4)——快速排序

快速排序是Hoare于1962年提出的,主要采取了分治的思想。快速排序首先确定一个基准值,然后以这个选出的基准值为标准,将整个数组进行按大小进行区分,使得小于该基准值的位于其一侧,大于基准值的位于另一侧。这样就将整个数组分为了小于标准和大于标准两部分,再对每一部分进行同样的处理方法由此完成排序。快速排序在每一趟的执行中,因为基准值左侧均是小于,右侧都是大于,所以一定会确定基准值的位置,从而使得分治的下一步会分别处理左侧右侧两部分而不再包含该基准值,所以递归可以顺利进行下去。

2024-02-01 19:44:52 934

原创 排序(3)——堆排序

堆排序,看名字就能知道这种排序是基于堆这种数据结构所设计出的一种排序方式。堆排序实际上是基于选择排序做出的一些升级。选择排序是通过每次遍历的方法来选出最大元素,毫无疑问限制其效率的主要因素就是遍历的开销,那么有没有其他方法能够高效实现选数呢,这时候堆就脱颖而出了。我们知道堆顶的元素是具有特殊性质的。对于大堆,堆顶的元素就是最大值;对于小堆,堆顶元素就是最小值。因此我们将待排序数据构成一个堆,那么选数不就很容易了。这也正是堆排序的核心所在。

2024-01-31 20:44:34 855

原创 排序(2)——选择排序

选择排序主要采取的排序策略就是选择,在拿到待排序数组后,程序会一遍遍地遍历未排序部分数组,在每一次的遍历过程中会找到最小的元素,并在遍历完成后换到未排序数组部分的最左侧。如此循环往复,每一次遍历选出一个最小的数据进行排序,最后达到整个数组有序。选择排序思想方法很简单,就是比较找到最小,然后交换,一次排好一个元素。我们也可以将选择排序做一些优化,比如每次选出一个最大的和一个最小的,分别排在左端和右端,这样排序是从两端同时开始,效率加倍。本文的选择排序就采取这种方法,一次遍历选出最大值和最小值。

2024-01-29 20:53:24 376

原创 排序(1)——直接插入排序、希尔排序

顾名思义,直接插入排序就是将数据直接插入到顺序之中。详细而言就是面对一个数组,假定某一位置之前的元素已经有序,需要将该元素也排入顺序之中,那么就需要这个元素与之前的顺序序列一一比较,找到其合适的位置插入进去。希尔排序是由DL.Shell于1959年提出,因而被命名为希尔排序。希尔排序可以看作是插入排序的升级版,它对插入排序取长补短。

2024-01-27 21:23:56 1039

原创 Top-K问题——堆的应用

Top-K问题是一个堆结构的经典问题,要求我们对给出的一组数据选出其中最大或者最小的k个元素。在拿到这个问题时,第一反应肯定都是排序,然后取所需要的k个元素即可。但是Top-K问题的数据量一般都很大,对其进行排序只为找到那短短k个元素,这个性价比怎么想怎么不甘心。除此之外,我们所学的排序算法多为内排序,当数据量大到一定程度时甚至有可能内存中脸数据都放不下。那么有没有其他方法可以更好地解决这个问题呢?这时,我们就可以搬出刚刚学过的堆来解决这个问题了。

2024-01-26 20:40:34 390

原创 数据结构——链式二叉树

对于二叉链的树而言,我们以链表的形式组织整棵树结构。因为二叉链要求在携带数据的同时,需要标明其左右孩子,因此我们定义的结构体中,有着两个指针,分别指向左右孩子。}BTNode;这两篇博客我们一共接触了两种二叉树的实现方式,分别是顺序二叉树和链式二叉树。其在实践中有着不可小觑的作用。对于顺序二叉树,我们需要对堆的数据存储方式加强理解,掌握大堆小堆的特征与控制方式;对于链式二叉树,因为其采用了大量的递归,所以对我们训练递归的思维是个很好的训练,而且从控制二叉树的过程中,能窥见一些更深奥的知识。

2024-01-25 21:33:51 1088 1

原创 数据结构——顺序二叉树——堆

因为我们已经明确了,堆是使用数组进行存储,所以堆的实现方式应该和顺序表相同。int size;}HP;

2024-01-14 21:56:13 1157 1

原创 数据结构——队列(Queue)

队列,顾名思义,作为有素质的新时代公民,在现实生活中我们常常会遇到排队的场景,而队列就是借此种情形衍生出来的数据结构形式。在需要排队的时候,我们面对一个队列会自觉地站在队尾。随着当队伍中的人慢慢出队,我们的位置也从队尾慢慢移动到了队头,当我们成为一个队的第一个人时,我们就明白终于轮到我们出队了。队列这种数据结构组织数据的形式和排队的场景十分相似,均为先进先出,后进后出的规则。在掌握了栈这种数据结构的基础之上,我们再来学习队列会比较轻松。

2024-01-08 17:43:28 1200

原创 数据结构——栈(Stack)

栈这个东西我们并不陌生,有过一些基础知识的同志都知道,在存储器映像中就有一块存储区域被称为栈。这个栈主要是存储非静态局部变量,函数调用所开辟出的栈帧也在这块区域。先进后出,后进先出。在程序运行时(以Linux+IA32为例),栈顶指针esp在面对push和pop指令时会对应的减或加,栈空间的开辟和释放都是由esp指针来标定的。所以可以看到在栈区内,当要完成空间释放或申请时,总是在对最顶部的空间进行操作,即满足“先进后出,后进先出”的规则。

2024-01-07 20:11:09 1218

原创 数据结构——带头循环双向链表(List)

为了实现链表的双向结构,我们需要从定义入手。单链表的链表结点定义是一个指向下一个结点的指针,而双向链表则需要两个指针,分别指向上一个和下一个结点。}LTNode;

2023-11-26 18:16:31 557

原创 数据结构——单链表(Singly Linked List)

建立一个单链表需要多个结点共同构成,我们针对单链表一个结点进行定义,将其定义为一个结构体,包含数据和下一个结点的指针。}SLNode;无头单向不循环链表,这种链表虽然结构简单但是应用广泛。在最近的学习过程中,我发现不少与链表有关的题目多用单链表来设题,除此之外,一些更加复杂的结构也需要用单链表作为支撑,所以可以看出其重要性。除此之外,恰恰是因为其结构简单,所以对特殊情况的限制较少,这就需要我在写代码时充分考虑可能会发生的所有情况,以便做出合理控制。

2023-11-25 00:36:38 492

原创 数据结构——顺序表(SeqList)

顺序表,顾名思义就是顺序储存数据的数据管理方式。在物理层面来看,顺序表将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。因为顺序表采用的是一段物理地址连续的储存单元一次存储数据元素,所以我们一般会采用数组的方式来存储。涉及到数组的存储,我们便会有两种方式,一种是静态的顺序表,即使用定长的数组来存储元素;而我们今天介绍的是另一种动态的顺序表,即采用动态开辟的数组进行数据的存储。

2023-11-03 12:46:07 516

原创 C语言——二周目——程序的翻译与执行环境

对于一个C语言程序的实现,整个过程一般存在两个不同的环境,分别是翻译环境与执行环境。在翻译环境中,我们所写的源代码经过一系列处理被转换成为可执行的机器指令;在执行环境中,会实际执行代码。整个程序在这两个环境中处理,由我们所写的.c文件最后变为.exe文件。该图便是程序在翻译与运行过程中的流程,每一个源文件通过编译转换为单独的一份目标代码,这些生成的目标文件最后由链接器捆绑在一起,链接器同时引入标准库与个人库内容,从而形成一个单一而完整的可执行程序。以下的内容,我们会一一介绍这些流程具体做了哪些事情。

2023-10-21 14:06:22 648

原创 C语言——二周目——输入输出辨析

以往的输入为默认形式(标准输入流——stdin——键盘)。但是输入的形式不止此一种。可以从键盘上敲出输入的数据,同时也可以将文件中、某个字符串甚至结构体的数据作为输入内容进行输入。输入,即为从某个地方获取数据。如各种get家族、各种scanf家族、以及fwrite,均是选择一个数据来源,获取该来源的数据。

2023-10-19 21:29:47 355

原创 C语言——二周目——数据在内存中的存储

我们所熟知的int类型通常在内存中占用4个字节的空间,而short类型占用2个字节,char类型则使用1个字节的空间。2)E有可能为负数,所以存入E时会加上一个中间数,E为8位时中间数为127,E为11位时中间数位1023。②E全为0:此时E的真实值为-127(-1023),有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数,以表示+-0或接近于0很小的数字。②对于一个有符号整数家族的类型,其所能表示的最小的负数为符号位取1,其余位取0;③E全为1:此时如果有效数字M全为0,表示+-无穷大。

2023-10-16 22:36:37 118

原创 C语言——二周目——字符串与内存库函数总结

3)strtok函数找到str的下一个分隔符后,将其用'\0'结尾,返回一个指向这个'\0'前字符串首字符的指针。1)字符串'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前出现的字符个数(不包含'\0')。1)源字符串必须以'\0'结束,strcat从目标字符串的'\0'开始,执行到源字符串的'\0'字符停止。2)当字符串不以'\0'结尾时,将输出一个随机值(系统越界访问直到找到'\0'字符为止)。2)如果源字符串的长度小于num,则拷贝完源字符串后,在后面追加'\0'直到num个。

2023-10-08 20:03:04 69

原创 C语言——二周目——自定义类型

位段是结构体的一种特殊形式,位段的声明和结构体相似,但有两个不同:1)位段的成员必须是int , unsigned int , signed int 或char类型。2)位段的成员名后有一个冒号和一个数字。int b:5;int c:10;int d:30;联合是一种特殊的自定义类型,这种类型定义的变量也包含一系列成员,但特别的是这些成员共用一块空间。

2023-10-07 23:12:14 35

原创 C语言——二周目——扫雷

想必扫雷是大家第一次接触电脑时第一次接触到的游戏吧。如此经典的游戏,玩法也很简单,其数字代表所在九宫格内地雷的数目,根据数字避开所有的地理,即可取得胜利。对于这样一款简单的小游戏,C语言同样可以实现完整复刻。与之前写过的三子棋类似,扫雷同样是棋盘类的游戏,以二维数组的方式存储相关信息是非常不错的选择。只不过有所区别的是,扫雷相较于三子棋需要两个二维数组。我们在完成扫雷这个小游戏时,需要考虑到地雷的信息不能暴露给玩家,同时又需要让玩家看到自己的扫雷棋盘,所以我们就需要两个二维数组。

2023-10-06 17:45:02 37

原创 判断带环链表,快慢指针步数是否受限?

LeetCode碰到的一道有关判断链表是否带环的题目。考虑快慢指针的步数差是否会对最后的判断产生影响?

2023-10-05 01:30:28 69

原创 C语言—二周目—三子棋

本文介绍了井字棋(三子棋)通过C语言的实现方法,重点分析了思路以及关键流程。

2023-10-02 01:13:52 44

原创 以奔狼之势,追逐星辰

根据人的需求层次而言,满足生存的需要是底层需求,而我身为IT人,自然也会努力学习,争取把自己变得更有价值,获得更多的市场竞争力。以奔狼之势,追逐星辰。沉潜,他日才可一飞冲天。

2023-09-08 17:21:41 43

原创 C语言程序设计——预处理命令

_FILE__ // 进行编译的文件(绝对位置)__LINE__ // 文件当前的行号__DATE__ // 文件被编译的日期__TIME__ // 文件被编译的时间__STDC__ // 在编译C11和C17代码时将其设置为1int main()return 0;;case文本纯替换。其中parament-list时一个由逗号隔开的符号表,它们可能出现在stuff中。参数列表的左括号必须与name紧邻。SQUARE(5);// 5*5 为25// 5+1*5+1 为11。

2023-07-11 19:35:19 86

原创 C语言程序设计——文件操作(下)

根据文件指针的位置和偏移量来定位文件指针。第一个参数是文件指针,第二个参数是对文件指针位置的偏移量,第三个参数是文件指针当前的位置。(文件指针当前的位置) 、(文件的末尾位置)、SEEK_SET(文件的起始位置)。打开文件时文件指针默认在起始位置。

2023-06-19 22:31:01 54

原创 C语言程序设计——文件操作(中)

感觉该部分使用的输入输出函数很多,在此处做以总结。1)明确输入的意义。以往的输入以默认形式(标准输入流——stdin——键盘)。但是输入的形式不止此一种。可以从键盘上敲出输入的数据,同时也可以将文件中、某个字符串甚至结构体的数据作为输入内容进行输入。输入,即为从某个地方获取数据。如上述的各种get家族、各种scanf家族、以及最后的fwrite,均是选择一个数据来源,获取该来源的数据。2)明确输出的意义。同输入一样,以往的输出也以默认形式(标准输出流——stdout——屏幕)。

2023-06-18 17:18:21 77

空空如也

空空如也

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

TA关注的人

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