- 博客(19)
- 收藏
- 关注
原创 设计模式之策略模式——C++
一、定义定义一系列算法,把它们一个个封装起来,并且使它们可变化。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。二、使用场景在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对象的算法,将算法与对象本身解耦?对于性能负担的理解:如果用if else语句,函数会变得很长,这一个函数在同一个代码段,在使用时会整个加载到内存中,但此代码段中又有很
2021-06-06 11:12:44 141
原创 设计模式之模板方法模式——C++
一、类别 Template Method属于组件协作模式。 组件写作模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。 典型模式:Template Method、Observer / Event、Strategy二、定义 定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(重写)该算法的某些特定步骤。三、代码对比背景:对于应用程序的开发,一般是先创建Librar
2021-06-06 10:17:09 150
原创 设计模式之单例模式——C++
一、定义单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。让类自身负责保存它的唯一实例,这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。饿汉式单例类:静态初始化。在对象自己被加载时就将自己实例化。懒汉式单例类:在对象第一次被引用时,才会将自己实例化。区别:饿汉式,是类一加载就实例化的对象,所以要提前占用系统资源。懒汉式又会面临着多线程访问的安全性问题,需要做双重锁定才能保证安全。二、实现懒汉式:class Singleton{
2021-06-03 11:01:54 135
翻译 static关键字的作用
一、修饰变量静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用 extern 声明也没法使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它。想要使用就得在前面再加 extern ***。恶心吧?要想不恶心,很简单,直接在文件顶端定义不就得了。静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他函数也用不了。由于被 static 修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值还是不会被销毁,
2020-11-12 15:44:46 163
原创 uint8_t、uint16_t、uint32_t、uint64_t
它们都是用 typedef 定义的数据类型,它包含在头文件<stdint.h>中。对整型而言:uint8_t为1字节uint16_t为2字节uint32_t为4字节uint64_t为8字节具体定义为:typedef signed char int8_t;typedef short int16_t;typedef int int32_t;typedef long long int64_t.
2020-11-12 15:26:51 10129
原创 函数指针与指针函数
首先明确符号 * 与 () 的优先级: () 的优先级高于 *指针函数:返回值是指针的函数函数指针:指向一个函数的指针int * ToUp(char *);这是一个“具有类型为 char * 的参量,返回类型是 int * 的指针”int * ToUp(char *){ int *p; return p;}int (*p)(char *);这是一个指向函数的指针,而这个函数的参量类型是 char *,返回值类型是 int.(*p) 意味着 p 是一个指向函数的指针int.
2020-11-12 15:17:39 280 1
原创 结构体使用中 -> 和 . 的区别
->用于结构体指针,X->Y与(*X).Y等价,(*X).Y是指针X指向的结构体中的Y.用于结构体struct book{ int num; char word;};int main(){ struct book* A; struct book B { 9, 'C' }; A = &B; printf("%d\t%c\n", B.num, B.word); printf("%d\t%c\n", A->num, A->word); pri
2020-11-12 11:54:18 526
原创 图的拓扑排序
拓扑序列:一些活动,其中某些活动必须在另一些活动完成之后才能开始,一定是无环的有向图,称为AOV网。拓扑排序,其实就是对一个有向图构造拓扑序列的过程。构造时会有两个结果:如果此网的全部结点都被输出,则说明其为不存在环的AOV网。如果没有输出全部顶点数,则说明这个网存在回路,不是AOV网。拓扑排序基本思路:从AOV网中选择一个入度为0的顶点输出,然后删去此结点,并删除以此结点为尾的弧,继续重复此步骤,直到输出全部顶点或者AOV网中不存在入度为0的顶点为止。在拓扑排序的过程中,需要删除顶点,用邻接表会更加
2020-11-09 15:36:06 1167
原创 最短路径:迪杰斯特拉算法与弗洛伊德算法
对网图和非网图,最短路径含义的不同的。非网图的最短路径:两顶点之间经过的边数最少的路径。网图的最短路径:两顶点之间经过的边上权值之和最少的路径。迪杰斯特拉(Dijkstra)算法解决了从某个源点到其余各项点的最短路径问题。时间复杂度为O[n2]。若想找到从源点到某一个特定终点的最短路径,这个问题和求源点到其他所有顶点的最短路径一样复杂。若源点为v0,终点为v8,此算法不是一下子就求出了v0到v8的最短路径,而是一步步求出它们之间顶点的最短路径,过程中都是基于已经求出的最短路径的基础上,求得更远顶点的最
2020-11-09 15:08:19 661
原创 图的最小生成树:普利姆算法、克鲁斯卡尔算法
最小生成树(Minimum Cost Spanning Tree):对于一个带权值的图,即网结构,n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小。有两种算法:普利姆(Prim)算法和克鲁斯卡尔(Kruskal)算法。这两者都是基于邻接矩阵的。普利姆(Prim)算法普利姆算法是以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树的。思路:假设 N = (P, {E}) 是连通网, TE 是 N上最小生成树中边的集合。算法从 U = {u0}(u0 属于 V), TE = {}
2020-11-09 10:06:05 515
原创 图的深度优先遍历、广度优先遍历
邻接矩阵的深度优先遍历:typedef int Boolean; //bool型变量,表示已经访问过,表示未访问过Boolean visited[MAXVEX]; //访问标志的数组//邻接矩阵的深度优先递归算法void DFS(MGraph G, int i){ int j; visited[i] = 1; printf("%c ", G->vexs[i]); for (j = 0; j < G->numVertexes; j++) if (G->arc[i
2020-11-06 16:19:48 78
原创 图的存储结构:邻接矩阵、邻接多重表
图有5种存储结构:邻接矩阵、邻接多重表、邻接表、边集数组、十字链表。一、邻接矩阵对于无权无向图:若顶点 i 与顶点 j 间有边,则 V[i][j] = V[j][i] = 1,若无边,则为0。V[i][i] 必为0。此时邻接矩阵必为对称矩阵。对于无权有向图:若顶点 i 与顶点 j 间有边,则 V[i][j] = 1,若无边,则为0。V[i][i] 必为0。对于有权有向图:若顶点 i 与顶点 j 间有边,则 V[i][j] = 权,若无边,则为无穷。V[i][i] 必为0。邻接矩阵存在一个问
2020-11-06 14:55:41 932
翻译 字符串匹配的朴素模式与KMP模式
* 什么是朴素模式?朴素模式思路:从主串的第一位开始与要匹配的字符串的第一位做对比,若相同,比较下一位,若不同,从主串的第二位开始与要匹配的字符串的第一位做对比,以此类推。 例:主字符串 M 为 ababcdx,要匹配的字符串 T 为 abx。 第一次:M[0] == T[0], M[1] == T[1], M[2] != T[2], 第一次匹配失败。 第二次:M[1] != T[0], 第二次匹配失败。 第三次:M[2] == T[0], M[3] == T[1], M[4] != T[
2020-11-06 10:38:26 76
翻译 优先队列(堆)
优先队列的声明typedef ElementType int;struct HeapStruct{ int Capacity; int size; ElementType *Elements;};typedef struct HeapStruct *PriorityQueue;PriorityQueue Initialize(int MaxElements){ PriorityQueue H; if(MaxElements < MinP
2020-10-10 15:51:46 83
翻译 二叉树
定义typedef struct TreeNode *Position;typedef struct TreeNode *SearchTree;struct TreeNode{ Elementype Element; SearchTree Left; SearchTree Right;};建立一棵空树SearchTree MakeEmpty(SearchTree T){ if(T != NULL) { MakeEmpty(T->
2020-10-10 14:54:13 84
翻译 队列
声明#ifndef QUEUE_H_INCLUDED#define QUEUE_H_INCLUDEDtypedef int ElementType;struct QueueRecord{ int Capacity; int Front; int Rear; int Size; ElementType *Array;};struct QueueRecord;typedef struct QueueRecord *Queue;#endif // Q
2020-09-24 11:02:35 104
翻译 链表
定义typedef int Elementype;typedef struct Node *PtrToNode;typedef PtrToNode List;typedef PtrToNode Position;struct Node{ Elementype Element; Position Next;};判空int IsEmpty(List L){ return L->Next == NULL;}判断是否为最后一个节点int IsLast(P
2020-09-24 10:27:50 58
原创 C语言txt文件排序
插入排序void InsertionSort(int A[], int N){ int j,p; int tmp; for(p = 1; p < N; p++) { tmp = A[p]; for(j = p; j > 0 && A[j-1] > tmp; j--) A[j] = A[j - 1]; A[j] = tmp; }}希尔排序void Shellsort(int A[], int N){ int i,j,k,
2020-09-24 10:06:01 1668
原创 C语言按行读文件与读文件中每一个字符
这里写自定义目录标题1.按行读取文件,分别获得文件中的每一行。2.读取文件中的每一个字符并写入字符串数组。1.按行读取文件,分别获得文件中的每一行。char Buffer[100];fp = fopen (“filename”, “r”);while(fgets(Buffer,sizeof(Buffer)-1,fp)){printf("%s\n",Buffer);}//每一次循环得到新的一行并写入Buffer2.读取文件中的每一个字符并写入字符串数组。char Buffer[100];
2020-06-19 14:26:35 2810
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人