数据结构与算法
文章平均质量分 73
这个家伙很懒~
这个作者很懒,什么都没留下…
展开
-
算术表达式
题目描述: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。输入: 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。输出: 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。样例转载 2016-03-15 21:58:36 · 2291 阅读 · 0 评论 -
【图的最短路径】迪杰斯特拉算法求图的最短路径
要求:求带权有向图中某一结点到其他结点的最短路径。用迪杰斯特拉算法求解,迪杰斯特拉算法书上的描述如下:对于图G=(V,{E}),将图中的顶点归为两组:第一组S:已求出的最短路径的终点集合(开始为{v0})第二组:V-S尚未求出的最短路径的顶点的集合(开始为V-{v0}的全部顶点)该算法将最短路径长度的递增顺序逐个将第二组中的顶点加入到第一组中,直到所有的顶点都被加入到第一组顶点原创 2016-03-11 15:01:37 · 2424 阅读 · 0 评论 -
【图的DFS】图的DFS非递归算法
在DFS的递归算法中,DFS框架如下:1访问起点v02依次以v0的未访问的连接点为起点,DFS搜索图,直至图中所有与v0路径相通的顶点都被访问。3若该图为非连通图,则图中一定还存在未被访问的顶点,选取该顶点为起点,重复上述DFS过程,直至图中全部顶点均被访问过为止。而在非递归的DFS框架中,运用栈来取代递归(递归的本质就是入栈出栈),所以用自定义的栈取代递归栈,具体框架如下:1原创 2016-03-11 15:41:10 · 5281 阅读 · 0 评论 -
螺旋数组
要求:螺旋数组是指将给定的存储连续自然数的二维数组中的数字从最外层开始以顺时针形式输出如:二维数组为 {{1,2,3,4}, {5,6,7,8}, {9,10,11,12},{13,14,15,16}}则输出为: {{1,2,3,4}, {12,13,14,5}, {11,16,15,6}, {10,9,8,7}}先上代码,然后再来分原创 2016-03-11 15:57:49 · 17326 阅读 · 0 评论 -
整数划分
整数划分,是指把一个正整数n写成如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi) 例如当n=4时,结果应为,{4},{3,1},{2,2},{2,1,1},{1,1,1,1};在算法书上介绍的思路如下: 根据n和m的关系,考虑以下原创 2016-03-11 16:23:27 · 1364 阅读 · 0 评论 -
约瑟夫环
要求:约瑟夫环的一种描述为:序号为1,2,...,n的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数),开始时任选一个数作为报数上限m,从第一个人开始顺时针自1开始顺序报数,报到m时停止报数,报的m的人出列,将他的密码作为新的m值,从他开始在顺时针方向的下一个人开始重新从1报数,如此下去,直至所有人全部出列,请设计一个程序,求出出列顺序。如:当m的初始值为20,n=7,7个人的密码依次原创 2016-03-12 10:09:54 · 1336 阅读 · 0 评论 -
【数据结构队列的应用】用队列打印杨辉三角
数学中的杨辉三角大家都不陌生,那怎样用程序的方式求n行的杨辉三角呢?方法很多,队列就是其中的一种。下面给出基于队列实现的杨辉三角。# include# define M 100typedef struct { int a[M]; int front,rear;}sq;void init(sq *q){ q->rear=q->front=0;}int enter(sq *原创 2016-03-12 11:00:58 · 9561 阅读 · 0 评论 -
用动态规划解决最长公共子序列
要求:最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。而最长公共子串(要求连续)和最长公共子序列是不同的 运用动态规划解决,不懂的可以参考任意一本算法书,一般都会介绍动态规划算法,以下部分解析选自算法书上。原创 2016-03-12 16:37:30 · 1306 阅读 · 0 评论 -
反转链表
要求:定义一个函数,将一个链表反转。链表节点定义如下:struct ListNode{ int data; ListNode *m_pNext;};思路:所谓反转即将链表中某个节点的原本指向后一个节点的指针域指向前一个节点,如果用pCurrent表示当前处理节点,pPrev表示当前处理节点的前一个节点,则很容易想到,反转即pCurretn->m_pNext=pPrev;但是如果直接原创 2016-03-13 21:48:09 · 1229 阅读 · 0 评论 -
【数据结构栈应用系列】括号匹配
括号匹配算法在各种编程的IDE工具中都会用到,用来检测关于括号匹配的语法错误,括号匹配实际上不复杂,主要就是利用栈这个数据结构,扫描输入的字符串,若遇到左括号则直接入栈,若遇到右括号则弹出栈顶括号,看是否与当前括号类型相同(如同为小括号(),或同为[],注意括号应该是在英文输入法的情况下输入的),若相同则二者匹配,否则不匹配,另外,如果扫描完成,而栈中仍存在未匹配的括号,则说明不匹配,当且仅当扫描原创 2016-03-26 16:59:10 · 14713 阅读 · 1 评论 -
【二叉树系列】二叉树课程大作业
本博客将以代码的形式详细讲解二叉树的所有算法,包括创建二叉树,二叉树的三种遍历方式,二叉树的各种属性算法,如:求高度,求叶子节点数,求节点数,以及二叉树最常见的应用哈夫曼树,代码如下:# include# include# include# include# define N 1# define M 2*N-1typedef char * HC[N+1];typedef stru原创 2016-03-26 16:21:35 · 68377 阅读 · 1 评论 -
数据结构排序算法之堆排序
关于堆排序的相关知识非常复杂,不懂得可以参考任意一本数据结构教程,本博客只对堆排序框架及代码进行讲解。堆排序分三个大的步骤:建初堆,堆调整,堆排序(其中最核心的是堆调整)1建初堆:从数组中的最后一个非叶子节点开始,从下而上倒推(重复调用堆调整函数)2堆调整:堆调整的前提是已建好了一个堆,但是因为输出,导致需要重新调整堆3堆排序:从数组中所有元素开始,将堆顶元素与堆尾元素交换,然后数原创 2016-03-11 16:45:26 · 29573 阅读 · 0 评论 -
【BAT经典算法面试题系列】求和为n的连续正整数
马上就要到9月份了,意味着一年一度的秋招就要开始了,相信不论是正在实习的童鞋还是马上就要找工作的童鞋,BAT无疑是国内的“明星企业”,是每个学计算机的小伙伴们心之向往的企业,但是呢?对于进BAT来讲,即使你项目经验非常丰富,想进BAT,还有一道门槛要过那就是算法面试,尤其是想去百度的小伙伴们,那算法必须得考,也是面试中的重点。说实话,对于算法这个东西,真的得靠天赋的,不是像项目那样,你多做多动手自原创 2016-08-12 11:11:16 · 5267 阅读 · 2 评论 -
MD5算法原理
MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2、MD3和MD4发展而来。MD5算法的使用不需要支付任何版权费用。 MD5功能: 输入任意长度的信息,经过处理,输出为128位的信息(数字指纹); 不同的输入得到的不同的结果(唯一性); 根据128位的输出结果不可能反推出输入的信息(不可逆); MD5属不属转载 2016-08-25 21:32:06 · 944 阅读 · 1 评论 -
求解n皇后
要求:在国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法思路:很直观的想法就是在棋盘上一个一个皇后的摆,如果冲突,则摆放在另一个位置,直至此次可以把n各皇后摆好而不产生冲突,则说明此种方法为一个解。然后将最后一个放置的皇后换个位置摆放,直至不产生冲突为止。很显然,此种思路即为算法中的回溯算法。基于此思路代码如下:#includ原创 2016-03-11 14:31:16 · 2019 阅读 · 5 评论 -
求某一字符串的最长重复子串
要求:给定一个字符串,求该字符串的最长重复子串,最长重复子串是指在一个主串中,重复子串中最长的那一个,如:abcdefadef 则答案为:def。预备知识:要解决此题,要用到后缀数组(用指针数组来表示)思路:先用后缀数组存储主串的每个子串的后缀,然后对后缀数组中的元素进行排序。最后通过扫描相邻两个数组中的后缀来判断最长的子串基于此思路代码如下:#include #include原创 2016-03-11 14:24:18 · 3145 阅读 · 0 评论 -
字符串的n位左旋
要求:将主串的某一段(n位)翻转到主串的最后,如:abcdef以2位翻转则结果为:cdefab。要求时间复杂度为O(n),空间复杂度为O(1)思路一:可以重新定义一个与原串相同大小的字符数组result[len],用来存放最终结果,先将原串中的后len-n位复制到result[len]数组的前len-n位,然后将原串的前n位复制到result[len]中的后n位,但这种思路要求重新定义一个中间原创 2016-03-10 21:59:11 · 1175 阅读 · 0 评论 -
二叉树的递归与非递归
要求:给定一个二叉树序列,要求以递归与非递归的形式先序输出。递归的本质就是系统自动用系统工作栈来将参数入栈与出栈,所以递归化与非递归就是程序员自己来控制参数的入栈与出栈,可用循环加自定义栈来控制。代码如下:#include#includeusing namespace std;typedef struct BTNode{ char ch; struct BTNode *lc原创 2016-03-11 16:06:07 · 1349 阅读 · 0 评论 -
顺时针打印数组
要求:输入一个矩阵,按照从外向里以顺时针的顺序打印出每一个数字。如:如果输入的矩阵为:1 2 3 45 6 7 89 10 11 12 13 14 15 16 则输出结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路:根据题目描述,我们可以得到一些提示信息,即我们可以把该矩阵看作是一个原创 2016-03-16 18:35:18 · 29329 阅读 · 0 评论 -
打印二叉树和为某一值的路径
要求:输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。二叉树的节点定义如下:struct BTNode{ int data; BTNode *leftChild; BTNode *rightChild;};思路:因为求路径是从根节点到叶子结点,所以我们可以考虑二叉树的先序遍历框架,如下所示:原创 2016-03-16 20:39:17 · 2460 阅读 · 0 评论 -
字符串的排列
要求:输入一个字符串,打印出该字符串中的字符的所有排列。如:输入字符串abc,则打印出abc,acb,bac,bca,cab,cba.思路:我们可以把一个字符串看成是两部分组成:第一部分为它的第一个字符,第二部分为余下的全部字符。求整个字符串的全排列我们可以看作是:首先求所有可能出现在第一个位置的字符,即把第一个字符和余下的每一个字符交换,第二部:固定第一个字符,求余下字符的全排列。这个时原创 2016-03-17 17:10:35 · 27114 阅读 · 0 评论 -
字符串的组合
要求:输入一个字符串,输出该字符串的所有组合。如:若字符串为:abc,则应输出:(空集),a、b、c、ab、ac、bc、abc.思路:考虑到数学中的排列组合知识,我们知道所谓组合即是在字符串中选取某些字符组合在一起,而在二进制中我们可以用0代表未选取某字符,1代表选取了某字符,这样自然可以想到用位运算来实现该过程。位运算结果为1则代表该位被选取。如000代表空集,001代表选取最后一个字符原创 2016-03-17 16:32:38 · 4093 阅读 · 0 评论 -
将一个数组划分为和差值最小的子数组
要求:将数组中的数划分为两组,使得两个子数组的和的差值最小,数组中的数的取值范围为0如:a[]={2,4,5,6,7},得出的两组数:{2,4,6}和{5,7},abs(sum(a1)-sum(a1))=0;如:{2,5,6,10},abs(sum(2,10)-sum(5,6))=1;所以:子数组为:{2,10}和{5,6}。思路:很容易知道如果选取的某个子数组的和currentS原创 2016-03-18 17:21:11 · 21339 阅读 · 2 评论 -
算法之大整数乘法
大数的表示方法有很多种,最易懂的而且最跟手工计算方式最接近的方式是通过字符数组来保存大数,数组的每个元素保存大数的一个十进制数字,这种方式操作比较简单,但是这种方式需要较多的额外运算,所以效率低下。另一种方式是采用链表作为存储结构,这种方式可以适应不同长度的大数,但是这种方式的存储效率很低,对本身就需要不少内存空间的大数运算来说负担很重,而且频繁的堆操作和解引用操作会大量增加开销,此外链表存储的不转载 2016-03-31 21:28:34 · 3276 阅读 · 0 评论 -
求连续子数组的最大和
要求:输入一个整型数组,数组里有正数也有负数,数组中一个或连续的多个整数构成一个子数组,求所有子数组的和的最大值。如:输入的数组为{1,-2,3,10,-4,5,1,-5},则输出结果为15.思路一:最直接的思路,可以用两层for循环解决,用来枚举出所有的子数组的和,但这种方式时间复杂度显然为O(n*n)思路二:因为只要求输出子数组和最大的值且连续,因此,很自然想到如果用cur原创 2016-03-09 16:02:46 · 1010 阅读 · 0 评论 -
统计一个句子中的单词个数
要求:输入一个字符串,输出该字符串中的单词的个数,如" I am a college studnet. hei hei",输出结果为7思路:用一个while循环扫描整个字符串,先将单词个数初始化为0,当扫描到一个单词则sum++,关键是如何判断是否满足为一个单词,如果用字符指针pIndex指向当前处理字符,则满足*pIndex!=' '&&*(pIndex+1)==' '时即为一个单词,基于原创 2016-03-10 12:09:33 · 4881 阅读 · 0 评论 -
寻找第k元
要求:给定一个数组array[n],寻找大小排在第k的元素思路一:最直接的思路就是先排序,这样可以直接通过数组下标找到第k大的元素,最好的快速排序时间复杂度为O(nlogn)。思路二:我们可以在快速排序的基础上进行改进,即运用快速排序框架,不过快速排序中的基准元素,我们采用随机划分而不是快速排序那样指定为一个固定的值。此方法时间复杂度为O(n)此思路的代码如下:#include#原创 2016-03-10 15:44:59 · 1165 阅读 · 0 评论 -
【数据结构课程大作业】通信录管理系统
该软件为本人数据结构课程设计作业,采用win32控制台程序,基于链表的增删改查,可供计算机专业在校大学生作为数据结构课程设计参考每次使用需输入密码,初始密码为:123。可在软件主界面选择修改密码功能修改密码。具体功能如下:1输入信息。用来输入联系人的姓名与号码,当输入# #时表示结束。例如htq 1234567hq 123456789# #则htq 1234567原创 2016-03-10 14:45:30 · 35667 阅读 · 5 评论 -
字符串的包含
要求:给定一个主串X和子串Y判断主串是否包含子串,包含是指子串中的所用字符均在主串中出现,所谓出现不要求连续,如:主串X:abcdef 子串为:Y:cde,Z:ade,M:adx,则答案为true,true false,要求空间复杂度为O(1)注意字符串的包含与字符串的查找的不同,具体可以参考我的博客:思路:因为是字符串的处理且要求空间复杂度为O(1),所以自然想到用哈希表处理,原创 2016-03-10 16:13:22 · 1702 阅读 · 0 评论 -
字符串的查找
要求:字符串查找即在主串X中查找是否包含子串Y,与字符串包含不同的是,字符串的查找必须是连续的,即Y中的子串必须在X中连续的出现才算。如:string main_str="ABCDEF";string sub_str_1="BCD";string sub_str_2="ACD";则在主串main_str中能查找到子串sub_str_1,而不能查找到子串sub_str_2.所以输出结原创 2016-03-10 15:50:50 · 740 阅读 · 0 评论 -
【数据结构排序算法系列】数据结构八大排序算法
排序算法在计算机应用中随处可见,如Windows操作系统的文件管理中会自动对用户创建的文件按照一定的规则排序(这个规则用户可以自定义,默认按照文件名排序)因此熟练掌握各种排序算法是非常重要的,本博客将对数据结构中常见的八大排序算法进行详细的讲解。写在前面的话:首先要明白在学习同类型的排序算法时,一定要明白任何相同领域存在的东西一定是竞争之后的结果,所以对于相同类型的排序之所以能够存在多种被人熟原创 2016-03-25 22:36:40 · 100003 阅读 · 9 评论