
【数据结构】
数据结构和算法乃是程序员内功修炼的秘籍,决定你在能在行业中走多远,虽然在工作中未必能用的着,但是当遇到瓶颈时可以给你另一种思路。
重庆李四
追求卓越,过完一生
展开
-
输入一个字符串,输出该字符串中字符的所有组合。
输入一个字符串,输出该字符串中字符的所有组合原创 2022-06-03 22:08:38 · 1218 阅读 · 1 评论 -
数据结构与算法——二叉排序树详解以及代码实现
二叉排序树介绍我们知道二叉树,每个结点最多有2棵子树,被称为左子树 和 右子树。 二叉排序树,显然也是一颗二叉树,它有更突出的特性在数据域上呈现排序的特性。 在二叉排序树中,每个树的左子树的数据域均小于它的根结点值,每个树的右子树的数据域均大于它的根结点值,每棵树的左、右子树 均为二叉排序树。从它特性很容易得到,对二叉排序树 进行中序遍历一定是升序序列。代码实现思路二叉排序树,相关...原创 2018-04-25 23:00:26 · 5400 阅读 · 1 评论 -
数据结构与算法——图解平衡二叉树及代码实现
平衡二叉树介绍平衡二叉树,是一种二叉排序树,其中每一个节点的左子树和右子树的高度差最多等于1。由3位科学家共同发明,用他们首字母命名 又被称为AVL树。从平衡二叉树的名称,你也可以体会到它是一种高度平衡的二叉排序树。我们将二叉树上结点的左子树深度减去右子树的深度的值称为平衡因子BF,那么平衡二叉树上的所有结点的平衡因子只能是-1,0,1。平衡二叉树的实现原理平衡二叉树构建的基本思想就在...原创 2018-04-28 17:36:54 · 18017 阅读 · 10 评论 -
Go语言编程:Go语言实现快速排序算法
前言今天用Go语言实现下经典排序算法——快速排序算法。主要是学习了Go语言,得用它来干点事情嘛,就用快速排序来练手。在Go语言语法方面,主要用到 切片数组,for循环(Go语言没有while循环),递归函数,各种流程控制。因为在Go语言中普通数组作为函数参数是值传递,所以用切片数组,作为函数参数传入类似引用。其实Go语言蛮好学的,如果有其他语言基础,可能会觉得语法很怪异。快速排序的思路还是在这里简...原创 2018-04-08 23:09:57 · 1779 阅读 · 1 评论 -
查找算法:折半查找算法实现及分析
折半查找算法介绍折半查找(Binary Search)又称为二分查找。它的前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储。从算法名称可以看出算法的思路,先取有序序列中间值与查找值进行比较,中间值小于查找值 就查找后一子表,如果中间值大于查找值 就查前移子表,直到查找到或者子表不存在为止。由于折半查找的查找范围是成倍的缩写,所以折半查找法的算法时间复杂度为logn。...原创 2018-02-27 19:44:10 · 11237 阅读 · 1 评论 -
查找算法:插值查找算法实现及分析
插值查找算法介绍插值查找(Interpolation Search)是根据要查找关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心就在于插值的计算公式key-arr[low]/arr[high]-arr[low]。细看是不是key在整序列中的占比哟。所以mid的计算公式为:(high-low)*(key-arr[low])/(arr[high]-arr[low])。对比折半查找的m...原创 2018-02-27 20:19:12 · 5140 阅读 · 6 评论 -
查找算法:斐波那契查找算法实现及分析
斐波那契查找算法介绍斐波那契查找法肯定与斐波那契相关嘛,斐波那契数列 又称黄金分割数列。所以我们先把黄金分割弄懂,后面代码才能看得懂!黄金分割点大家都知道吧。1:0.618或者1.618:1,我们的斐波那契数列越往后的项数 越接近黄金分割比例,打个比方 斐波那契数列第k项 F[k] = F[k-1]+F[k-2]。F[k-1] : F[k-2] ≈ 1:0.618 。回忆下我们的折半查找mid =...原创 2018-02-27 23:37:08 · 1085 阅读 · 1 评论 -
排序算法:快速排序算法实现及分析(递归形式和非递归形式)
快速排序算法介绍从名字上就可以看出快速排序算法很嚣张,直接以快速命名。确实快速排序 的确很快速,被列为20世纪十大算法之一。程序员难道不应该掌握么。快速排序(Quick Sort)的基本思想是:通过一趟排序将待排序记录分割成独立的2部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这2部分分记录继续进行排序,以达到整个序列有序的目的。没有理解?没关系,下面看图解。快速排序可以用递归...原创 2018-02-27 13:12:02 · 6420 阅读 · 2 评论 -
栈应用:判断字符串中括号是否成对出现
练习题目利用栈先将后出的特性,判断字符串中的数字表达式括号是否成对匹配,如果没有给出错误位置信息提示。代码实现代码思路很简单,如果是左括号将左括号 就入栈,遇到右括号 栈中的左括号出栈。如果该出栈的时候,栈空 肯定匹配错误。还有就是表达式遍历完毕,我们的栈 如果是全部匹配成功 ,栈肯定为空,不为空 匹配错误!这里我们使用之前写的顺序栈,不清楚的可以看:线性表:顺序栈算法实现。#define _CR...原创 2018-02-25 00:36:56 · 3622 阅读 · 0 评论 -
线性表:顺序队列算法实现
顺序队列介绍顺序队列是队列的顺序存储结构,顺序队列实际上是运算受限的顺序表。我们知道队列是一种先将先出的数据结构,它是一种受限制的线性表,我们的顺序队列是一种队列,采用的是顺序存储结构。与其对应的是采用链式存储结构的队列 也就是链式队列。顺序队列通常采用一维数组进行存储。所以呢本次编写顺序队列 就采用前面封装好的动态数组呗。动态数组你知道么,不知道请看:数据结构与算法:动态数组(利用万能指针实现任...原创 2018-02-25 22:47:34 · 3108 阅读 · 1 评论 -
排序算法:归并排序算法实现及分析
归并排序算法介绍归并排序(Merging Sort)就是利用归并的思想实现排序的放。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;再两两归并,.....,如此重复,直到得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。归并排序算法图解归并排序算法代码其实归并排序思路很好理解,就是将2个有序的序...原创 2018-02-25 00:12:11 · 1002 阅读 · 0 评论 -
树:二叉树的层序遍历算法(超简洁实现及详细分析)
实现思路我们来看看下图的二叉链表 如何实现层序遍历。层序遍历顺序:ABECDGA为B、E的双亲结点,遍历顺序是 根->左->右 是不是。而且每个结点都是这样的遍历顺序 有木有。那么我们完全可以采用队列的数据结构呗。A入队->然后出队,出队时将其左右孩子入队,循环队列进行出队,每次出队将其左右孩子入队。当队列为空时,整棵树层序遍历完毕。还没明白请看下面过程。A-&g...原创 2018-02-26 00:30:45 · 50741 阅读 · 10 评论 -
线性表:链栈算法实现
链栈介绍链栈也是我们所说的采用链式存储结构的栈。往往通过单链表的方式来实现,使用链式栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域。栈 是一种受限制的线性表,它具有后进先出(Last-In-First-Out)的特性。所以呢本次编写链栈呢 采用以前写的企业级单链表形式编写。不知道企业级单链表?请看数据结构与算法:企业级链表实现(超...原创 2018-02-25 23:13:37 · 461 阅读 · 0 评论 -
线性表:链式队列算法实现
链式队列介绍队列是一种受限制的线性表,有先进先出的特性。那么既然是线性表那肯定对应有2种不同的存储结构咯。链式队列呢,就是采用链式存储结构构成的队列。所以呢本次编写链队列呢 采用以前写的企业级单链表形式编写。不知道企业级单链表?请看数据结构与算法:企业级链表实现(超详细),感觉这种思想超赞,你值得拥有。链队列相关算法接口同样采用LinkQueue类型也就是void*类型返回给用户,对用户隐藏底层实...原创 2018-02-25 23:34:16 · 902 阅读 · 0 评论 -
线性表:顺序栈算法实现
顺序栈介绍顺序栈就是用顺序存储结构构成的后进先出这样结构的栈。一般我们用数组来进行模拟。为了让后顺序栈更通用呢,我们还是在数据类型上使用void*,我们只负责维护用户提供的数据的地址就行了,不负责用户数据的维护。对外提供的SeqStack 类型 是void*类型,可以用来隐藏我们栈内具体实现细节。顺序栈代码SeqStack.h头文件#pragma once#ifndef __SEQSTACK_H...原创 2018-02-25 00:24:11 · 910 阅读 · 0 评论 -
线性表之顺序存储结构相关算法学习
作为一名准备干一辈子的程序员,学习算法还是很有必要的。所以从基础开始了。学习教材 是大话数据结构。线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。代码 参照教材 采用c语言编写,稍作修改,加上一些个人理解。学习算法本来就是一个积累的过程,不断的去理解和模仿优秀的算法,然后再运用在实践中。#define MAXSIZE 20#define OK 1#原创 2017-12-17 07:07:19 · 541 阅读 · 1 评论 -
静态链表相关算法学习
大话数据结构学习笔记—静态链表学习c语言真是好东西,它具有指针能力,使得它可以非常容易地操作内存中的地址和数据,这比其他高级语言更加灵活方便。后来的面向对象的语言,如java、C#等,虽然不使用指针,但是因为启用了对象引用机制,从某种角度也间接实现了指针的某些作用。但是对一些Basic、Fortran等早期的编程高级语言,由于没有指针,链表结构按照前面我们的讲法,它就没法实现了。有原创 2017-12-19 23:35:44 · 490 阅读 · 3 评论 -
线性表之链式存储结构_单链表相关算法
在存储结构上,不需要连续的存储空间,需要上一个结点的指针域 指向下一个结点即可,找到一个结点就可以找到下一个结点。学习教材是大话数据结构,加上自己的一些个人理解。这个算法 有点绕,需要对指针 相关内容相当熟悉。通过学习感觉单链表相关算法还是蛮考验C知识的和逻辑思维。下面看代码:#include #include #define ERROR 0#define OK 1原创 2017-12-18 08:02:01 · 400 阅读 · 0 评论 -
栈的顺序存储及实现(一)
继续学习数据结构,今天我们来学习栈的相关知识。其实学习没有捷径,如果抱着一种吃快餐的态度进行学习,那是学不到东西,各种技术都是浅尝辄止,那注定学习是不会有太大的效果。不知道你们讨不讨厌 某某语言从入门到精通的这类书籍?我在想,有这么牛逼么,一本书直接都从入门到精通了,只不是吸引那些初学者的鳌头吧了。算法都是老前辈们留下来解决某一类问题非常行之有效的方法,不管什么时候都不会过时。虽然很多算法,在很多原创 2017-12-23 23:40:21 · 9248 阅读 · 5 评论 -
两栈共享存储空间算法
我们知道栈是一种先进后出的结构,我们用顺序存储结构进行实现,也是很方便的,唯一的缺陷就是必须事先确定数组存储空间大小,万一不够用了,就需要编程手段扩展数组容量,非常麻烦。对于一个栈,我们只能经理设计出合适大小的数组进行处理,但是对于2个相同类型的栈,我们可以共享其存储空间,最大限度的利用事先开辟的存储空间进行操作。关键思路:他们是数组的两端,向中间靠拢。top1和top2是栈和栈2原创 2017-12-26 07:50:37 · 8245 阅读 · 0 评论 -
栈的链式存储结构及实现
今天学习栈的链式存储结构。链式存储结构最大的好处就是没有空间的限制,通过指针指向将结点像一个链子一样把结点链接,那么栈的同样可以用于链式存储结构。栈的链式存储结构,简称为链栈。想想看,栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那么干嘛不让他们合二为一呢,所以比较好的办法是把栈顶放到单链表的头部。另外栈顶在头部了,那么单链表的头结点...原创 2017-12-26 10:43:59 · 16977 阅读 · 2 评论 -
数据结构之循环队列
继续学习数据结构。今天学习循环队列,在学习循环队列之前,我们得先知道什么是队列呀,然后才可以继续往下学习。首先我们回顾下队列的相关知识。队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。队列同样是一种线性表,队列也有类似线性表的各种操作,不同的是插入的数据是原创 2017-12-26 17:54:23 · 1637 阅读 · 2 评论 -
队列的链式存储结构及实现
队列的链式存储结构,其实就是线性表的单链表,只不过它只是尾进头出而已,我们把它简称为链队列。为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端节点。如果空队列时,front和rear都指向头结点。入队操作:在队尾添加元素,先将队尾元素的next指向添加的元素,然后将队尾指针重新指向新的队尾即可。出队操作:头结结原创 2017-12-26 22:34:28 · 16540 阅读 · 2 评论 -
算法面试题:快速找到未知长度单链表的中间节点
有道算法面试题:快速找到未知长度单链表的中间节点。你可以普通方法也可用比较好的方法,去解决这个问题。由于单链表不知道长度,必须遍历完整个单链表才知道单恋表的长度,然后根据一般的长度去找中间结点,这是普通方法。当然题目问的是快速找到,当然要用快速的方法啦。这里我们快慢指针的方法来解决这个问题,快指针每次走2个结点,慢指针每次走1个结点,当快指针走完链表,慢指针刚好走到中间,这就是快慢原创 2018-01-05 22:57:44 · 4851 阅读 · 2 评论 -
循环链表:约瑟夫问题(非常详细易理解)
约瑟夫问题来源据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从。首先从一个人开始,越过原创 2018-01-11 21:27:34 · 27913 阅读 · 12 评论 -
数据结构学习—循环链表的实现(非常详细)
今天我们来实现下循环链表的相关算法。LZ今天非常用心的写这个博客,一切解释说明都在代码中。认真写篇博客还是挺费时间的,但是写博客不但是对我们学习成长的一个见证,而且会提高我们向别人解释问题的能力对面试非常有帮助,分享也是一件非常快乐的事情嘛。下面贴代码:#define _CRT_SECURE_NO_WARNINGS#include #define ERROR 0#define原创 2018-01-10 23:47:30 · 36327 阅读 · 18 评论 -
算法面试题:如何判断单链表中是否存在环
题目分析一道算法面试题:判断单链表是否存在环。我们知道单链表中结点都是一个结点指向下一个结点这样一个一个链接起来的,直到尾结点的指针域没有指向,单链表就到此结束了。这里存在环的意思就是,尾结点的指针域并为空,而是指向此单链表的其他结点,这样就形成环了,这样遍历单链表就死循环了因为破坏了结束条件。前面我们算法面试题 快速找到单链表中间节点 所用的快慢指针,同样可以用来判断是否存在环,原创 2018-01-13 22:15:46 · 12318 阅读 · 1 评论 -
循环链表:魔术师发牌问题
魔术师发牌问题介绍魔术师发牌问题的简介:一位魔术师掏出一叠扑克牌,魔术师取出其中13张黑桃,洗好后,把牌面朝下。说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一,将第一张牌翻过来看正好是A;魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌子上。第三次数1,2,3,前面二张牌放到原创 2018-01-17 21:49:07 · 1128 阅读 · 3 评论 -
循环链表:拉丁方阵问题
拉丁方阵问题介绍拉丁方阵是一种n×n的方阵,方阵中恰有n种不同的元素,每种元素恰有n个,并且每种元素在一行和一列中 恰好出现一次。著名数学家和物理学家欧拉使用拉丁字母来作为拉丁方阵里元素的符号,拉丁方阵因此而得名。例如下面是一个3×3的拉丁方阵:1 2 32 3 13 1 2拉丁方阵问题分析矩阵的第一行是 1 2 3 从第一个元素开始到最后一个元原创 2018-01-18 00:27:36 · 1230 阅读 · 0 评论 -
双向循环链表:字母表实现前后移动
问题描述要求实现用户输入一个数使得26个字母的排列发生变化,例如用户输入3,使得结果为:DEFHIJKLMNOPQRSTUVWXYZABC,同时需要支持负数,使得输入-3时,结果为:XYZABCDEFGHIJKLMNOPQRSTUVW。实现位置的前后都能移动且数据都是连着的,当然数据结构选择双向循环链表啦。问题拓展问题实际上是有关凯撒密码,凯撒密码的思想是通原创 2018-01-20 00:17:10 · 1200 阅读 · 0 评论 -
双向循环链表:维吉尼亚密码
维吉尼亚密码简介维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。假如下面图第一行代表明文字母,左面第一列代表密钥字母,对如下明文加密:TO BE OR NOT TO BE THAT IS THE QUESTION当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,原创 2018-01-20 02:12:15 · 650 阅读 · 0 评论 -
栈的顺序存储及实现(二)
栈的介绍栈(stack)是限定仅在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又被称为后进先出(LastIn First Out)的线性表,简称LIOF结构。首先它是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系。只不过它是一种特殊的线性表而已。代码实现原创 2018-01-21 17:35:29 · 1241 阅读 · 0 评论 -
栈应用:实现二进制转八进制、十进制、十六进制
进制转换原理二进制转十进制二进制是计算机数据的存储形式,它是由一串0和1组成,每个二进制数转换成相应的十进制数方法为:(XnXn-1Xn-2...X3X2X1)2 = X1*2^0+X2*^1+...Xn*2^(n-1)。二进制转八进制利用二进制转十进制原理,从低位起将每3位二进制转为1位十进制 然后进行替换即可。二进制转十六进制利用二进制转十进制原理,从低位起原创 2018-01-21 21:15:00 · 3690 阅读 · 0 评论 -
栈应用:中缀表达式转后缀表达式
网上有很多关于中缀转后缀的文章,很多文章或多或少都有bug,包括一些教学视频,经过本人无数次测试,保证下面的代码运算结果的正确性!前提是你写的中缀表达式是正确的哈,没有做中缀表达式是否正确的的完整性校验。采用的c语言编写的哈。中缀、后缀表达式区别中缀表达式:(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人...原创 2018-01-23 10:41:38 · 6918 阅读 · 4 评论 -
栈应用:后缀表达式求值
在上一篇博客 栈应用:中缀表达式转后缀表达式 中我们知道如何通过栈将中缀表达式转为后缀表达式,这次我们继续用栈 来实现后缀表达式求值,结合上一篇博客。上一篇博客中是用c语言实现的,由于c语言中不支持模板函数模板类,当我们遇到不同数据类型那么我们用结构体定义栈结构需要同时定义多个,那么对应的栈操作也需要定义多个,为了方便,我们将栈的实现用c++ 来实现,因为c++中有模板呀,可以很方便的构造不同数据...原创 2018-01-23 19:06:51 · 5595 阅读 · 0 评论 -
递归应用:折半查找法
折半查找法介绍在计算机科学中,折半搜索(英语:half-interval search),也称二分搜索(英语:binary search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半原创 2018-01-27 20:47:20 · 2277 阅读 · 0 评论 -
递归应用:八皇后问题
八皇后问题介绍八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2。而且仅当 n2 = 1 或 n1 ≥ 4 时问题有解。八皇后问题分析原创 2018-01-28 15:10:00 · 428 阅读 · 0 评论 -
字符串:BF算法
BF算法介绍BF算法,即暴风(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。BF算法分析算法思想很简单,就是子串的第一位可主串进行比较,如果相等原创 2018-01-28 21:25:10 · 1550 阅读 · 0 评论 -
字符串:你看的懂的KMP算法(带验证)
前言KMP算法可以说说许多学习算法的同学的第一道坎,要么是领会不到KMP算法的思想,要么是知道思想写不出代码,网上各种查找。关于算法的书籍上也都有KMP算法的实现,可为啥自己写不出来呢?博主看得大话数据结构上的分析,书上的代码都比较精简,但是不易理解 ,跟着代码思路走结果也是对的。那么我们为啥我们不可以多写几行代码 更加容易理解呢。博主今天就用普通程序员的思路 去写KMP算法 采用C语言实原创 2018-02-03 14:58:38 · 1106 阅读 · 0 评论 -
数据结构与算法:单链表(超详细实现)
实现算法预览这次博主写的单链表主要实现了以下算法。所有功能可进行循环运行测试。欢迎各位指正。LinkList.h#pragma once#ifndef __LINKLIST_H__#define __LINKLIST_H__#define _CRT_SECURE_NO_WARNINGStypedef struct LinkNode LinkNode;typedef struct Link...原创 2018-02-05 23:36:02 · 4985 阅读 · 0 评论