
基础数据结构+算法(初探)
基本的数据结构,算法入门。即对应的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 · 540 阅读 · 0 评论 -
八皇后问题 递归回溯思想 (递归分治篇)------- 算法笔记017
基本概念编程思想对于这样一个问题我们首先想是要创建一个8x8格式的棋盘,我们用二维数组去实现,数组中的每个值初始化为0,用值1表示这个地方已经放了棋子。这样我们每一行都用一个1来表示放了一个棋子。问题的关键在于递归回溯,和判断某一位置是否这一放置棋子。当我们在某一位置想要放置棋子时我们要先判断这个位置是否和上面的棋子在同一条线上,如果不在同一条线上就标志1,如果在就向后一个位置判断,假如...原创 2020-02-13 22:27:27 · 569 阅读 · 0 评论 -
汉罗塔问题 (递归分治篇)------- 算法笔记016
概念解读其实汉罗塔问题的实质就是利用眼前的这三根柱子,一次只能移动一个圆盘,其中一根作为中介柱,使一根柱子上的圆盘移到另一根上。在移动的过程中不能出现大的圆盘套在小的圆盘的上面。其实这个问题体现了递归的思想,上面的三种情况列举出来以体现问题的递归性。上面图片的解释并不完备!以三个汉罗塔举例:我们要将a柱上的汉罗塔全部移到c上,b柱为中转柱第一步:我们要设法将a柱上前两个移到b上,...原创 2020-02-12 00:04:05 · 1188 阅读 · 0 评论 -
斐波拉契数列 (递归分治篇)------- 算法笔记015
基本概念在上面的概念解析中我已经给出了迭代的代码实现,思路就是维护一个数组,用数学的表达式思维去实现这个数列。但是我们用递归来实现更加简洁有效。首先思考结束递归的条件,这里看到我们数列的前两个数都是1,没有规律可循,从第三个开始规律就是这个数是前两个数的和。那么我们递归的条件就是当不是第一第二个数的时候递归,否则返回1int Fib(int n){ //如果是到了第一第二个数就返回...原创 2020-02-11 17:24:40 · 282 阅读 · 5 评论 -
实现字符逆序输出 (递归分治篇)------- 算法笔记014
问题引出给定输入字符串:changlon love you !#以#号结尾要求程序读取并逆序输出 如: ! uoy evol nolgnahc我们有两种思路解决这个问题,第一种是先声明一块缓冲区,字符一次读入,最后从末尾处向前索引一次输出就是完成了一次读取再逆序输出的操作了。实现代码如下。#define MAX 1024void Print(){ char * str=(char...原创 2020-02-11 17:06:53 · 304 阅读 · 0 评论 -
二分法递归查找 (递归分治篇)------- 算法笔记013
问题引出给出我们一组数据:1 2 3 4 5 6 7 8 9 10要求返回要查找数据的下标对于这样的一个问题我们可以有两种思路去解决;第一种:将这组数据存入一个数组当中,初始化一个下标,依次遍历数组的的元素,每次遍历的时候我们判断这个数组中的数据是否和我们要查找的数据相同,如果相同则返回这个数据所在数组的下标。如果全部遍历后还没有发现与其相同的数据,就返回-1.int findNu...原创 2020-02-11 00:55:31 · 1126 阅读 · 0 评论 -
队列------- 算法笔记012
队列的概念队列和栈的不同在于,队列是先进先出的结构,而栈是先进后出的结构。所以我们在定义队列的数据结构的时候要定义一个前指针指向队列的头数据,和一个后指针指向队列的尾数据。队列的数据结构typedef char ElemType; //定义队列的数据类型typedef struct QNode{ ElemType data; struct QNode *next; //指向下一个...原创 2020-02-09 19:04:43 · 121 阅读 · 0 评论 -
逆波兰运算符和转换中缀表达式 (C语言编写逆波兰计算器) ------- 算法笔记011
逆波兰表达式编程思路我们可以输入一段逆波兰表达式,然后程序循环读取单个字符,判断字符是数字范围的还是计算符。当读到的是数字范围时我们将其入栈,当读到的是计算字符我们将前面的两个数Pop出来进行对应的计算,最后再将其入栈。Demo1实现代码#include <stdio.h>#include <stdlib.h>#define MAX_NUM_STACK ...原创 2020-02-08 19:34:58 · 933 阅读 · 0 评论 -
进制转换算法 (C语言实现一个简单的二进制转换工具) ------- 算法笔记010
进制转换算法概念其核心是利用栈的存储结构性质,进行数据的入栈出栈时的计算,让后将计算好的数据存入另一个栈内,最后再出栈输出。由于栈的先进后出特性,最后输出的顺序和输入的顺序是一样的。具体如上图。栈的结构#define ok 1#define error 0#define MAX_STACK_SIZE 10#define SIZE 32typedef int Status;ty...原创 2020-02-03 23:30:14 · 1337 阅读 · 0 评论 -
栈 (C语言创建一个栈) ------- 算法笔记009
栈的概念其实只要清楚栈这个结构的思想就可以,栈的具体结构定义也不为一。下面用最简洁的一种实现方法。栈储存数据的特点是先进后出,后进先出。拥有两个方法,Push,Pop.具体是对top,base指向的操作。其中top,base可以用指针的结构,也可以用int类型的结构,下面用的是int 类型。栈的结构体定义//stack.h#define MAX 10 //栈的空间大小typed...原创 2020-01-30 22:31:51 · 1533 阅读 · 0 评论 -
魔术师发牌问题 (C语言实现) ------- 算法笔记008
问题背景实质还是循环双向链表的应用,多了一个判断循环的步骤实现代码#include <stdio.h>#include <stdlib.h>#define numPokers 13typedef struct node{ int data; struct node *next;}Node,*List; //定义一组牌A-K ;A用1表示,对应的J,...原创 2020-01-29 20:41:20 · 556 阅读 · 0 评论 -
维吉尼亚加密算法 (C语言实现简单的加密算法) ------- 算法笔记007
概念理解什么是维吉尼亚加密算法加密步骤:1.创建一个匹配循环链表;2.接受需要加密的明文;3.根据随机生成的密钥配合链表进行移位;4.输出/保存对应的密文解密步骤: 1.接受加密后的密钥;2.根据密文找到对应的匹配值,通过密钥进行逆移位操作找到明文输出总的来说维吉尼亚加密算法就是对循环链表的查找操作这里我们来模拟a-z实现加密操作我们输入changlon,然后生成随机密钥,...原创 2020-01-29 13:05:02 · 2246 阅读 · 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 · 326 阅读 · 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 · 332 阅读 · 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 · 432 阅读 · 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 · 293 阅读 · 0 评论 -
静态表 (C语言实现静态链表) ------- 算法笔记002
概念理解在c语言中我们可以通过创建结构体和指针来建立一个链表,但是有的编程语言不支持指针,如java,直接将指针封装起来。在这种编程语言的背景下我们创建一个链表可以通过数组的方式来模拟,称之为静态链表。为何说是静态的呢》因为数组模拟的链表的长度是固定的。静态链表的结构游标数据下标1A0我们可以理解为一组结构体数组来模拟链表的情况静态链表的创建插入原理...原创 2020-01-18 20:29:33 · 430 阅读 · 0 评论 -
线性表 (C语言实现一个单链表) ------- 算法笔记001
单链表的综合运用实现函数:1.一个链表的创建2.链表的插入删除3.查看链表总数与快慢指针实现快速查找链表的中间值链表创建过程: 第一步:定义结构typedef struct structBody/*结构体类名*/{ ElemType data; // 定义你的结构体数据,ElemType是你自定义的数据类型如:typedef int ElemType struct struct...原创 2020-01-13 23:30:21 · 256 阅读 · 0 评论