基础数据结构+算法(初探)
基本的数据结构,算法入门。即对应的C实现代码
智者_若愚
这个作者很懒,什么都没留下…
展开
-
KMP算法原理解析 (递归分治篇)------- 算法笔记018
基本概念 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。 ——————...原创 2020-02-16 19:08:22 · 517 阅读 · 0 评论 -
八皇后问题 递归回溯思想 (递归分治篇)------- 算法笔记017
基本概念 编程思想 对于这样一个问题我们首先想是要创建一个8x8格式的棋盘,我们用二维数组去实现,数组中的每个值初始化为0,用值1表示这个地方已经放了棋子。这样我们每一行都用一个1来表示放了一个棋子。 问题的关键在于递归回溯,和判断某一位置是否这一放置棋子。当我们在某一位置想要放置棋子时我们要先判断这个位置是否和上面的棋子在同一条线上,如果不在同一条线上就标志1,如果在就向后一个位置判断,假如...原创 2020-02-13 22:27:27 · 550 阅读 · 0 评论 -
汉罗塔问题 (递归分治篇)------- 算法笔记016
概念解读 其实汉罗塔问题的实质就是利用眼前的这三根柱子,一次只能移动一个圆盘,其中一根作为中介柱,使一根柱子上的圆盘移到另一根上。在移动的过程中不能出现大的圆盘套在小的圆盘的上面。 其实这个问题体现了递归的思想,上面的三种情况列举出来以体现问题的递归性。 上面图片的解释并不完备! 以三个汉罗塔举例:我们要将a柱上的汉罗塔全部移到c上,b柱为中转柱 第一步:我们要设法将a柱上前两个移到b上,...原创 2020-02-12 00:04:05 · 1155 阅读 · 0 评论 -
斐波拉契数列 (递归分治篇)------- 算法笔记015
基本概念 在上面的概念解析中我已经给出了迭代的代码实现,思路就是维护一个数组,用数学的表达式思维去实现这个数列。 但是我们用递归来实现更加简洁有效。 首先思考结束递归的条件,这里看到我们数列的前两个数都是1,没有规律可循,从第三个开始规律就是这个数是前两个数的和。 那么我们递归的条件就是当不是第一第二个数的时候递归,否则返回1 int Fib(int n){ //如果是到了第一第二个数就返回...原创 2020-02-11 17:24:40 · 256 阅读 · 5 评论 -
实现字符逆序输出 (递归分治篇)------- 算法笔记014
问题引出 给定输入字符串:changlon love you !# 以#号结尾 要求程序读取并逆序输出 如: ! uoy evol nolgnahc 我们有两种思路解决这个问题,第一种是先声明一块缓冲区,字符一次读入,最后从末尾处向前索引一次输出就是完成了一次读取再逆序输出的操作了。实现代码如下。 #define MAX 1024 void Print(){ char * str=(char...原创 2020-02-11 17:06:53 · 291 阅读 · 0 评论 -
二分法递归查找 (递归分治篇)------- 算法笔记013
问题引出 给出我们一组数据:1 2 3 4 5 6 7 8 9 10 要求返回要查找数据的下标 对于这样的一个问题我们可以有两种思路去解决; 第一种: 将这组数据存入一个数组当中,初始化一个下标,依次遍历数组的的元素,每次遍历的时候我们判断这个数组中的数据是否和我们要查找的数据相同,如果相同则返回这个数据所在数组的下标。如果全部遍历后还没有发现与其相同的数据,就返回-1. int findNu...原创 2020-02-11 00:55:31 · 1074 阅读 · 0 评论 -
队列------- 算法笔记012
队列的概念 队列和栈的不同在于,队列是先进先出的结构,而栈是先进后出的结构。所以我们在定义队列的数据结构的时候要定义一个前指针指向队列的头数据,和一个后指针指向队列的尾数据。 队列的数据结构 typedef char ElemType; //定义队列的数据类型 typedef struct QNode{ ElemType data; struct QNode *next; //指向下一个...原创 2020-02-09 19:04:43 · 106 阅读 · 0 评论 -
逆波兰运算符和转换中缀表达式 (C语言编写逆波兰计算器) ------- 算法笔记011
逆波兰表达式 编程思路 我们可以输入一段逆波兰表达式,然后程序循环读取单个字符,判断字符是数字范围的还是计算符。当读到的是数字范围时我们将其入栈,当读到的是计算字符我们将前面的两个数Pop出来进行对应的计算,最后再将其入栈。 Demo1实现代码 #include <stdio.h> #include <stdlib.h> #define MAX_NUM_STACK ...原创 2020-02-08 19:34:58 · 895 阅读 · 0 评论 -
进制转换算法 (C语言实现一个简单的二进制转换工具) ------- 算法笔记010
进制转换算法概念 其核心是利用栈的存储结构性质,进行数据的入栈出栈时的计算,让后将计算好的数据存入另一个栈内,最后再出栈输出。由于栈的先进后出特性,最后输出的顺序和输入的顺序是一样的。具体如上图。 栈的结构 #define ok 1 #define error 0 #define MAX_STACK_SIZE 10 #define SIZE 32 typedef int Status; ty...原创 2020-02-03 23:30:14 · 1314 阅读 · 0 评论 -
栈 (C语言创建一个栈) ------- 算法笔记009
栈的概念 其实只要清楚栈这个结构的思想就可以,栈的具体结构定义也不为一。下面用最简洁的一种实现方法。 栈储存数据的特点是先进后出,后进先出。拥有两个方法,Push,Pop. 具体是对top,base指向的操作。其中top,base可以用指针的结构,也可以用int类型的结构,下面用的是int 类型。 栈的结构体定义 //stack.h #define MAX 10 //栈的空间大小 typed...原创 2020-01-30 22:31:51 · 1509 阅读 · 0 评论 -
魔术师发牌问题 (C语言实现) ------- 算法笔记008
问题背景 实质还是循环双向链表的应用,多了一个判断循环的步骤 实现代码 #include <stdio.h> #include <stdlib.h> #define numPokers 13 typedef struct node{ int data; struct node *next; }Node,*List; //定义一组牌A-K ;A用1表示,对应的J,...原创 2020-01-29 20:41:20 · 513 阅读 · 0 评论 -
维吉尼亚加密算法 (C语言实现简单的加密算法) ------- 算法笔记007
概念理解 什么是维吉尼亚加密算法 加密步骤:1.创建一个匹配循环链表;2.接受需要加密的明文;3.根据随机生成的密钥配合链表进行移位;4.输出/保存对应的密文 解密步骤: 1.接受加密后的密钥;2.根据密文找到对应的匹配值,通过密钥进行逆移位操作找到明文输出 总的来说维吉尼亚加密算法就是对循环链表的查找操作 这里我们来模拟a-z实现加密操作 我们输入changlon,然后生成随机密钥,...原创 2020-01-29 13:05:02 · 2216 阅读 · 0 评论 -
拉丁方阵问题 (C语言循环链表的应用) ------- 算法笔记006
问题解剖 实现代码 #include <stdio.h> #include <stdlib.h> typedef struct node{ int data; struct node *next; }Node,*List; //创建一个规模为n*n的循环链表 List createLoopList(List head,int n){ List p=head; ...原创 2020-01-26 23:35:07 · 290 阅读 · 0 评论 -
约瑟夫问题 (C语言链表,数组两种思路求解) ------- 算法笔记005
问题背景 C链表的实现思路 我们可以通过声明一个结构体,让后根据输入的值N动态的创建N个节点,让后将 它们链成一个循环链表。通过next指针操作模拟数人数。让后删除进行下一个节 的指向,作为第一个数数节点继续开始。直到链表中还剩一个节点的时候。 实现代码 void ysf_problem_ListSolve(int num){ //first create a loop-node-link...原创 2020-01-24 23:41:30 · 307 阅读 · 0 评论 -
判断循环链表 (C语言如何应用快慢指针) ------- 算法笔记004
概念 快慢指针判断链表是否有环 Bool ifLoopOfList(List head){ List quick=NULL; List slow=NULL; quick=slow=head; do{ quick=quick->next->next; slow=slow->next; printf("quick->%d\tslow->%d\...原创 2020-01-24 16:44:28 · 405 阅读 · 0 评论 -
双向循环链表 (C语言实现双向循环链表) ------- 算法笔记003
概念 我们常说的单链表是有向的链表,因为链表1中有next指针它对应指向链表2的地址 而链表2无法指向链表1,所以我们说它是单向的链表。 而双向链表则是链表1可以访问到链表2,链表2也可以访问到链表1 双向循环链表则是头尾相连的双向链表 结构定义 typedef struct Double{ ElemType data; struct Double * next,* prior; }Dou...原创 2020-01-23 19:11:41 · 260 阅读 · 0 评论 -
静态表 (C语言实现静态链表) ------- 算法笔记002
概念理解 在c语言中我们可以通过创建结构体和指针来建立一个链表,但是有的编程语言不支持指针,如java,直接将指针封装起来。在这种编程语言的背景下我们创建一个链表可以通过数组的方式来模拟,称之为静态链表。为何说是静态的呢》因为数组模拟的链表的长度是固定的。 静态链表的结构 游标 数据 下标 1 A 0 我们可以理解为一组结构体数组来模拟链表的情况 静态链表的创建插入原理...原创 2020-01-18 20:29:33 · 404 阅读 · 0 评论 -
线性表 (C语言实现一个单链表) ------- 算法笔记001
单链表的综合运用 实现函数: 1.一个链表的创建 2.链表的插入删除 3.查看链表总数与快慢指针实现快速查找链表的中间值 链表创建过程: 第一步:定义结构 typedef struct structBody/*结构体类名*/{ ElemType data; // 定义你的结构体数据,ElemType是你自定义的数据类型如:typedef int ElemType struct struct...原创 2020-01-13 23:30:21 · 232 阅读 · 0 评论
分享