- 博客(117)
- 收藏
- 关注
转载 数据结构-栈 二
1. 栈的基本操作—出栈如图:出栈(pop)操作,是在栈不为空的情况下(注意一定要进行判空操作),将栈顶的元素删除,同时top指针,next向下进行移动即可的操作。其代码可以表示为: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 //出栈pop Link_St.
2021-08-13 14:00:14
175
转载 先进后出的数据结构-栈 一
1. 栈的概念在开始前,请牢记这句话:栈是一种先进后出的数据结构。栈(stack)是限定仅在表的一端进行操作的数据结构,请联系我们前文所学的,设想一个单链表我们只能够对其链表的表尾结点进行操作,而操作也只能够进行插入一个新的结点与删除最末尾的这个结点两个操作,而这样强限制性的‘链表’,就是我们所说的栈。让我们重新理顺一下定义:栈是一个线性的数据结构,规定这个数据结构只允许在其中一端进行操作,并禁止直接访问除这一端以外的数据。如图:栈就像一个放球的单管桶,只允许球从桶的开口这一端取出,
2021-08-13 13:50:22
1138
转载 双向链表二
1. 双向链表的插入操作如图所示:对于每一次的双向链表的插入操作,我们首先需要创建一个独立的结点并通过malloc操作开辟相应的空间,其次我们选中这个新创建的独立节点,将其的pre指针指向所需插入位置的前一个结点,同时,其所需插入的前一个结点的next指针修改指向为该新的结点,同理,该新的结点的next指针将会指向一个原本的下一个结点,而修改下一个结点的pre指针为指向新结点自身,这样的一个操作我们称之为双向链表的插入操作。证券模拟试题其代码可以表示为: 1 2 ..
2021-08-06 16:08:20
197
转载 双向链表一
1. 双向链表的简介&概念单链表在很多时候已经可以胜任很多优秀的操作了,但是,单链表任然存在不足,所谓‘单链表’,是指结点中只有一个指向其后继的指针,具有单向性,有时需要搜索大量数据的时候,就必须要多次进行从头开始的遍历,这样的搜索不是很便利。图:单链表示意图对此在单链表的基础上,产生了双向链表的概念,即: 在单链表的基础上,对于每一个结点设计一个前驱结点,前驱结点与前一个结点相互连接,构成一个链表。双向链表可以简称为双链表,是链表的一种,它的每个数据结点中都有两个指针,分.
2021-08-06 15:49:24
145
转载 什么是单链表二
(续接前文)1. 遍历单链表(打印,修改)便利的概念想必大家都不会陌生,即就是从链表的头开始,逐步向后进行每一个元素的访问,这就是遍历,对于遍历操作,我们可以衍生出很多常用的数据操作,比如说查询元素,修改元素,获取元素个数,打印整个链表数据等等。进行遍历的思路极其简单,只需要建立一个指向链表L的结点,然后沿着链表L逐个向后搜索即可。对于遍历操作,以下是代码实现: 1 2 3 4 5 6 7 8 9 ..
2021-08-06 15:41:58
86
转载 什么是单链表一
1. 单链表概念&设计单链表是一种链式存取的数据结构,,链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。以“结点的序列”表示的线性表称作线性链表(单链表),单链表是链式存取的结构。对于链表的每一个结点,我们使用结构体(struct)进行设计,其主要内容有:其中,DATA数据元素,可以为你想要储存的任何数据格式,可以是数组,可以是int,甚至可以是结构体(这就是传说中
2021-08-06 15:05:59
1734
转载 顺序存储和链式存储
1. 再谈数组—顺序存储我们在开始计算机课程没多久后就已经知晓了数组的概念,数组作为一个顺序储存方式数据结构为我们的程序设计带来了大量的便利,几乎任何的高级程序设计,算法设计都离不开数组的灵活使用,但是,数组最大的缺点就是我们的插入和删除时需要移动大量的元素,显然这需要消耗大量的时间。以C语言数组插入一个元素为例,当我们需要在一个数组{1,2,3,4,5,6,7}的第1个元素后(即第2个元素)的位置插入一个’A’时我们需要做的有,将第1个元素后的整体元素后移,形成新的数组{1,2,2,3,4,5
2021-08-06 14:59:32
440
转载 复杂度的度量方法
接上文,在理解了时间复杂度的概念后,就可以根据实际的代码进行度量了,以下举例了几个常用的时间复杂度的表示,对于如何度量其最重要的是观察程序中的循环结构,每一个循环结构代表执行循环中的指令n次,而其余指令一般而言一行代码代表执行一次,对于一个程序而言,执行的次数相差较小其实没有什么区别,都是一瞬间执行完毕。1. 度量时间复杂度a)O(1) / O(C) C代表常数 1 2 3 4 5 #include<stdio.h>...
2021-08-06 13:46:25
974
转载 理解复杂度概念
1. 时间空间复杂度定义1) 时间复杂度时间复杂度表示一个程序运行所需要的时间,其具体需要在机器环境中才能得到具体的值,但我们一般并不需要得到详细的值,只是需要比较快慢的区别即可,为此,我们需要引入时间频度(语句频度)的概念。时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。一般情况下,算法中的基本操作重复次数的是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同
2021-08-06 13:36:04
215
转载 数据结构基础
1. 基本概念和术语1)数据数据(Data)是信息的载体,是可以被计算机识别,存储并加工处理的描述客观事物的信息符号的总称。数据不仅仅包括了整形,浮点数等数值类型,还包括了字符甚至声音,视频,图像等非数值的类型。2)数据元素数据元素(Data Element)是描述数据的基本单位,也被称为记录。一个数据元素有若干个数据项组成。如禽类,鸡鸭都属于禽类的数据元素。3)数据项数据项(Data Item)是描述数据的最小单位,其可以分为组合项和原子项:a)组合项如果数据元素可以再
2021-08-06 13:33:42
377
转载 C语言算法基础
1. 算法的特性1) 输入输出算法具有零个或者多个输入,同时,算法具有至少一个的输出。对于在屏幕上打印”Hello World”一样,你可以不需要有任何的输入,直接输出得到结果即可,而对于一个没有输出的算法,没有任何意义。个人理财2) 确定性算法的每一步都具有确定的含义,无二义性。任何条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出。请注意,如果算法的目的是产生一个随机数字,每一次运行产生了不同的结果,看上去好像违反了算法确定性原则,但计算机产生随机数亦是使用一
2021-08-05 15:39:33
464
转载 数据结构与算法
请牢记:程序=数据结构+算法1. 数据结构发展史1) 起源:1968年美国唐•欧•克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构语其操作的著作。我们一般认为本书开创了数据结构的系统概念。70年代初,数据结构作为一门独立的课程开始进入大学课堂。数据结构的发展经历三个阶段:无结构阶段,结构化阶段和面向对象阶段(和程序发展的三个阶段不谋而合了)2) 无结构阶段40~60年代见,计算机的主要应用还没有如此普
2021-08-05 15:33:41
404
翻译 C语言数学基础
在开始我们数据结构的教程之前,你需要具备以下数学基础知识,这些知识可能不会马上体现在计算机编程中,但是随着学习的深入,这些知识愈发愈用的平凡,于其遇到了再的碎片化,不如我们单独开出一节来单独学习这些数学基础知识注意,我们这里只是简单提及一些公式和原理,具体的内容和深入学习请参考《高等数学》《离散数学》《数论》相关知识。1. 指数指数是幂运算aⁿ(a≠0)中的一个参数,a为底数,n为指数,指数位于底数的右上角,幂运算表示指数个底数相乘。如43=4*4*4一些基本的公式2. 对数..
2021-08-05 15:30:24
1610
翻译 数据结构与算法入门
1.首 欢迎阅读本教程。 本套教程由UDP广播协议叫吃饭 编写,面向对计算机编程有一定基础的同学,如果你对计算机完全属于一种小白的状态,建议前往(C语言教程)以及(C++教程)进行基础的学习。本教程IDE采用来自https://sourceforge.net/projects/orwelldevcpp/下载的DEV-C++,这个IDE更多的被算法竞赛中所使用,无论是中学生的NOIP,还是大学生的蓝桥杯,均是多使用此IDE的,这个IDE轻巧且跨平台,深受学生喜爱。2.数据结构介绍 “
2021-08-05 15:16:35
99
转载 C++如何关闭文件
对于前两步,打开和读写大家熟练使用之后,那么最后一步关闭文件也就容易多了在结束相关操作之后,只需要在最后调用close成员函数即可,即会断开文件与程序的关联,结束操作该close函数是ifstream、ofstream、fstream的成员函数,在使用时用打开的文件对象通过.直接调用即可通过学习前面的读写操作,可以注意最后一步关闭文件的语句,如:基金从业备考技巧 1 2 3 4 5 6 7 8 9 10
2021-08-05 15:13:55
1076
转载 C++写文件操作
接上篇,对于要用C++进行写文件,则可以用ofsteam或fstream类型,依次经过打开、写数据、关闭三个步骤完成。请看如下实例: 1 2 3 4 5 6 7 8 9 10 11 12 #include<fstream> #include<iostream> usingnamespacestd; intmain() {...
2021-08-05 15:11:36
1701
转载 C++读文件操作
C++的输入输出用到了iostream头文件,这个头文件名字意思就是io流,那么今天我们学习文件读写,其实也是流,叫做文件流,因此他的头文件需要包含fstream,它定义了三个类,负责文件的读、写、读写操作,分别如下:类型 意义 ofstream (out) 表示输出文件流,用于创建文件并向文件写入信息。 ifstream (in)表示输入文件流,用于从文件读取信息。 fstream (file)表示文件流,且同时具有 ofstream 和 ifstream 两种功能
2021-08-05 15:09:43
192
转载 C++如何打开文件
要想对文件继续读写,首先完成第一步打开,那么C++如何打开文件? 这里需要用到在fstream类中的成员函数open()实现打开文件的操作,open函数是istream、ostream、fstream的成员函数,它的原型如下: 1 voidopen(constchar*filename,ios::openmodemode); 第一个参数filename表示要打开的文件路劲第二个参数mode表示打开文件的模式,有如下:参数 作用 ios...
2021-08-05 15:08:11
5668
转载 C++读写文件操作
C++中对于文件的操作,主要是用过以下几个类来支持的,它们分别是:ofstream: 写操作(输出)的文件类 (由ostream引申而来)ifstream: 读操作(输入)的文件类(由istream引申而来)fstream: 可同时读写操作的文件类 (由iostream引申而来)他们都需要包含头文件: 1 #include<fstream> 依旧像C语言那样,对文件的读写操作也是三个步骤,分别是:1.打开文件2.读写文件3.
2021-08-05 15:06:42
148
转载 C++标准异常处理类
C++给我们提供了标准的异常处理类,它用来抛出C++标准库中函数执行时的异常。C++提供的标准异常类的层次结构如图:可以看到,所有的异常类都继承自exception基类,exception类下的logic_error和runtime_error又是两个比较大类,包含有多个自类,它们分表代表逻辑类错误和运行时错误举例说明,如: 我们使用new开辟内存时,如果遇到空间不足,则会抛出bad_alloc的异常 我们使用dynamic_cast()进行动态类型转化失败时,则抛出bad_ty
2021-08-05 15:04:47
562
转载 C++异常处理机制
C++为我们提供了一种结构化形式的,更为优雅的异常处理机制,这种结构化机制可以把程序中正常执行的代码和异常处理的部分分开表示,使程序变得更清晰易读,更为优雅!下面,来看异常处理的结构,共分两部分: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 try { //正常程序...
2021-08-04 15:13:16
118
转载 异常的概念
程序的错误通常包括:语法错误、逻辑错误、运行异常下面分别介绍: 语法错误,这个不必多说,大家在之前的学习一定都知道,就是只程序代码不符合语法要求,在编译、链接时候就由编译器提示出来的错误,好发现。 逻辑错误,这种情况,是指编译没问题,没有错误,可以运行起来。但程序的输出结果或执行过程不如我们所愿,达不到预期的结果,这种错误就叫做逻辑错误,需要不断的调试、测试来发现。 运行异常(exception),是指程序在运行过程中由于意外的情况,造成的程序异常终止,比如内存不足、打开的文件
2021-08-04 15:11:26
499
转载 纯虚函数与抽象类
纯虚函数与抽象类纯虚函数,就是没有函数体的虚函数。什么叫没有函数体? 就是这样定义的函数:virtual 返回值 函数名(形参)=0;可以看到,前面virtual与虚函数定义一样,后面加了一个=0。表示没有函数体,这就是一个纯虚函数。包含纯虚函数的类就是抽象类,一个抽象类至少有一个纯虚函数。抽象类的存在是为了提供一个高度抽象、对外统一的接口,然后通过多态的特性使用各自的不同方法,是C++面向对象设计以及软件工程的核心思想之一。抽象类的特点总结如下:1. 抽象类无法实例出一个对象来,.
2021-08-04 15:08:41
134
转载 虚析构函数
虚析构函数在C++中,不能把构造函数定义为虚构造函数,因为在实例化一个对象时才会调用构造函数,且虚函数的实现,其实本质是通过一个虚函数表指针来调用的,还没有对象更没有内存空间当然无法调用了,故没有实例化一个对象之前的虚构造函数没有意义也不能实现。但析构函数却是可以为虚函数的,且大多时候都声明为虚析构函数。这样就可以在用基类的指针指向派生类的对象在释放时,可以根据实际所指向的对象类型动态联编调用子类的析构函数,实现正确的对象内存释放。下面我们做一个实验,请看代码: 1 2
2021-08-04 14:55:45
77
转载 什么是虚函数
首先引出,我们的新知识点—虚函数(virtual function)这是一种什么函数呢? 简单讲,就是一个函数前面用virtual声明的函数,一般形式如下:virtual 函数返回值 函数名(形参){ 函数体}那它有什么用呢? 虚函数的出现,允许函数在调用时与函数体的联系在运行的时候才建立,即所谓的动态联编。那么在虚函数的派生类的运行时候,就可以在运行的时候根据动态联编实现都是执行一个方法,却出现不同结果的效果,就是所谓的多态。这样解决上一节的问题就有了办法。接下来,我...
2021-08-04 14:06:23
220
转载 多态性概述
多态性多态性是面向对象程序设计的重要特性之一,从字面意思上可以简单理解就是:多种形态,多个样子。其实本质意思也是这样,在面向对象程序设计中,指同样的方法被不同对象执行时会有不同的执行效果。在具体来说,多态的实现又可以分为两种:编译时多态和运行时的多态。前者是编译的时候就确定了具体的操作过程。后者呢是在程序运行过程中才确定的操作过程。这种确定操作过程的就是联编,也称为绑定。联编在编译和连接时确认的,叫做静态联编,前面我们学习的函数重载、函数模板的实例化就属于这一类。另一种是在运行的时候,才能确
2021-08-04 14:03:07
1182
转载 虚基类及虚基类的定义使用
虚基类在前面学过的继承过程中,不知道大家有没有想到这种情况:在多继承关系中,如果一个派生类的从两个父类那里继承过来,并且这两个父类又恰恰是从一个基类那里继承而来。那这样就麻烦了,因为你可能继承了两份一样的成员!这就出现了所谓二义性问题,下面我们展开学习:先给大家举一个能说明这种多继承的例子吧,笔者我想来想去,想了这么一个例子:以前呢有一个大户人家,起初呢就两口子,男主人掌权,保管着大门钥匙,后来他们有两个儿子,若干年后长大成人,男主人也老了,就把钥匙又配了两把,分别交给他的两个儿子,交由他们主持
2021-08-04 14:00:50
4494
转载 派生类的析构函数
同上一节一样,在派生类中,析构函数也无法被派生类吸收。重点大家需要清楚派生类和基类的析构函数的调用顺序,析构函数的调用顺序与构造函数则完全相反,我们可以在派生类析构函数和基类析构函数中输出一条信息,观察调用顺序: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
2021-08-04 13:57:19
115
转载 派生类的构造函数
由于派生类包含基类的原因,我们在创建一个派生类的时候,系统会先创建一个基类。需要注意的是,派生类会吸纳基类的全部成员,但并不包括构造函数及后面讲的析构函数,那么就意味着创建派生类在调用自己的构造函数之前,会先调用基类的构造函数。这里一点我们可以通过代码验证: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2021-08-04 13:54:47
73
转载 三种继承方式
在上一节中,我们看到了派生类的定义方法,用到了public的公有继承,实际这里一共有三种方式,分别是公有继承、私有继承、保护继承。不同的继承方式,主要区别在于基类中不同访问权限的成员在派生类中的访问权限变化情况。下面一一介绍。先来说说公有继承,公有继承的模式下,特点如下:1. 基类中的公有成员,在派生类中仍然为公有成员。当然无论派生里的成员函数还是派生类对象都可以访问。2. 基类中的私有成员,无论在派生类的成员还是派生类对象都不可以访问。3. 基类中的保护成员,在派生类中仍然是保护类型,
2021-08-04 13:52:54
576
转载 继承和派生
继承与派生如果头一次听到这个名字的话,就先要想想这两个词的意思了。先来说继承,这与现实生活中的继承意思差不多,比如一个人继承另一个人的财产、以及子承父业等等是一个意思,拥有的这个过程就叫做继承。 同样,在C++中,比如有两个类,新类拥有原有类的全部属性叫做继承!原有类产生新类的过程叫做派生!而我们把原有的这个类称之为父类或基类,由基类派生出的类叫做派生类或者叫做子类。大家从名字上就可以看出他们的关系。那么继承和派生有什么好处呢?为什么C++要有这种机制呢?1. 体现面向对象的编程思想,更
2021-08-03 15:31:12
136
转载 C++中常数据的使用及初始化
常数据成员的使用及初始化常的概念我们在学C语言时候就有了解,关键字是const,所谓的“常”,或或者说被“常”修饰的变量,是不可修改、被改变的,比如用const修饰的一个变量就成了常变量,这个值不可被更改。那么C++中,一样有常的概念,额外不同的是,const除了可以修饰一般的变量为常变量之外,还可用于修饰某个对象,变成常对象。以及可以修饰类的数据成员和成员函数,分别叫做类的常数据成员和常成员函数。下面,我们依次对常数据成员、常成员函数、常对象展开讲解。1. 常数据成员对于常数据成员的用
2021-08-03 15:27:40
1850
转载 友元类的使用方法
学习友元函数之后,我们再来看友元类,也是一样的道理和使用方法,如果把一个类A声明为另一个类B的友元类,则类A中的所有成员函数都可以访问B类中的成员。使用方法也一样,在类B中进行声明即可。还是上一节的程序功能,我们稍作更改: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
2021-08-03 15:23:35
2716
转载 友元函数的使用方法
我们都知道类中的私有成员,只有被类里的成员函数访问,在类外是不能访问的。这体现了C++中类设计的封装、隐蔽思想。是C++最基本的优点。但如果偶尔有的时候,我们在类外又确实想访问这些私有成员,就会变得麻烦很多,就处于既访问不到又不能声明为public类型的两难处境。而友元的出现就可以很好的解决这个问题。即把外部的函数声明为友元类型,赋予它可以访问类内私有成员的权利。来做到两全其美。这就是友元的意义,从字面意思也可以看出来,像“朋友”一样,开了一个绿色通道。银行从业考试技巧友元的对象,它可以是全局的
2021-08-03 14:50:13
1706
转载 C++中的this指针
this指针一个类当中,有一个很隐蔽的特殊指针,它就是—this指针!为什么说它特殊?因为只要定义一个类,系统就会预定义个名字叫做this名且指向当前对象的指针。虽然我们看不到但却可以使用它。比如,我们来看一个时钟类的一个成员函数,用来设置时间传值的代码: 1 2 3 4 5 6 intClock::SetTime(inth,intm,ints) { H=h; M=m;...
2021-08-03 14:47:41
75
转载 浅拷贝与深拷贝
浅拷贝与深拷贝在上一节讲解的拷贝构造函数的例子Circle类中,拷贝的策略都是与系统默认的策略一致,即把原有对象中成员依次拷贝给新对象中对应的成员,既然如此,我们为何还要自己定义呢?原因在于,简单的将所有情况都按照这种简单的方式初始化,难免有不同的情况,出现问题。例如,刚才的Circle类中,如果成员变量中加一个指针成员,初始化中需要动态开辟内存,则会出现极大的安全隐患,代码如下: 1 2 3 4 5 6 7 8 9
2021-08-03 14:39:00
44
转载 拷贝构造函数
在C++中,与类名同名,且形参是本类对象的引用类型的函数,叫做拷贝构造函数(Copy Constrctor),与构造函数一样,当我们不主动定义的时候,系统也会自动生成一个,进行两个对象成员之间对应的简单赋值,用来初始化一个对象,如如下的情形: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2021-08-03 14:31:57
74
转载 C++中的析构函数(Destructor)
除了上一节讲到的类对象在创建时自动调用的构造函数,在对象销毁时也会自动调用一个函数,它也和类名同名,也没有返回值,名字前有一个个波浪线~,用来区分构造函数,它的作用主要是用做对象释放后的清理善后工作。它,就是析构函数与构造函数相同的是,与类名相同,没有返回值,如果用户不定义,系统也会自动生成一个空的析构函数。而一旦用户定义,则对象在销毁时自动调用。与构造函数不同的是,虽然他俩都为公开类型。构造可以重载,有多个兄弟,而析构却不能重载,但它可以是虚函数,一个类只能有一个析构函数。银行从业报名条件下面
2021-08-03 14:29:59
281
转载 C++中的构造函数(Constructor)
C++中有这么一种特殊的函数,它在类里,与类名同名,且没有返回值的一个函数,只要我们定义一个类的对象,系统就会自动调用它,进行专门的初始化对象用,而大多数情况下,因为我们没有定义构造函数,系统会默认生成一个默认形式、隐藏着的构造函数,这个构造函数的函数体是空着的,因此不具有任何功能。那么下来,我们将教大家如何定义自己的构造函数,需要用户自行定义了至少一个构造函数,系统就不在自动生成,而是根据用户定义的构造函数选择最匹配的一个进行调用。例如还是Student类的例子,我们添加一个带有默认参数的构造函数
2021-08-03 14:27:10
415
转载 对象的建立和使用
大家还记得上节课的“类是对象的抽象和概括,而对象是类的具体和实例。”这句话吗,学会类的定义之后,下一步就是对象的创建和使用了1.对象的创建类就是包含函数的结构体,是一种自定义数据类型,用它定义出来变量,就是对象,这就是所谓的“对象是类的具体和实例”,定义了一个这个类的对象,也可以说实例化了一个对象,就是这个意思!而对象的使用,和结构体的使用也一样,都是主要访问里面的成员,也都是用过.的方式来访问,如: 1 2 3 4 5 Stude
2021-08-03 14:07:53
116
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人