到目前为止,我们一直在谈论的数据结构都是"线性结构",不论是普通链表.栈还是队列,其中的每个元素(除了第一个和最后一个)都只有一个前驱(排在前面的元素)和一个后继(排在后面的元素),但是在深入浅出数据结构(9)中,我们发现有的时候"线性结构"是不能满足我们的需求的,必然存在某些场景需要我们使用非线性的数据结构.而今天,我们要讨论的就是典型的非线性数据结构--树. 该从哪里开始谈起树是一个很麻烦的问题,我想了很久决定还是先给出树的"模样",再说说树…
  相信学习过C语言的读者都已经接触过递归(不论是谭浩强的C程序设计还是C Primer Plus都有递归程序),本文就是对递归的基本原则进行简要介绍.首先,我们写一个基本的递归函数作为例子: int func ( int N ) { ) ; ); } 然后来看看递归的基本原则,在看基本原则的同时,我们可以对照这个示例进行一一比对.   递归基本原则: 1.基准情形.递归函数中必须要有某些基准情形,即不需递归就能求解的情况.(否则递归就相当于死循环.示例中基准情形为N<=1) 2.不断推进.对于…
正如上一篇博文所说,今天我们来讨论一下所谓的"高级排序"--快速排序.首先声明,快速排序是一个典型而又"简单"的分治的递归算法. 递归的威力我们在介绍插入排序时相比已经见识过了:只要我前面的队伍是有序的,我就可以通过向前插队来完成"我的排序",至于前面的队伍怎么有序--递归实现,我不管. 递归就是如此"简单"的想法:我不管需要的条件怎么来的,反正条件的实现交给"递归的小弟们"去做,只要有基准情形并且向着基准…
上一次我们从什么是表一直讲到了链表该怎么实现的想法上:http://www.cnblogs.com/mm93/p/6574912.html 而这一次我们就要实现所说的承诺,即实现链表应有的操作(至于游标数组--我决定还是给它单独写个博文比较好~). 那么,我们的过程应该是怎么样的呢?首先当然是分析需要什么操作,然后再逐一思考该如何实现,最后再以代码的形式写出来. 不难发现,我们希望链表能支持的(基础,可以由此延伸)操作就是: 1.给出第n个元素 2.在第n个元素的后面插入一个元素(包含在最后一个…
所谓算法的"时间复杂度",你可以将其理解为算法"要花费的时间量".比如说,让你用抹布(看成算法吧--)将家里完完全全打扫一遍大概要5个小时,那么你用抹布打扫家里的"时间复杂度"就是5个小时. 但是,在对算法进行分析时,并没有那么简单.大部分情况下我们不能一眼看出算法执行完需要耗费多少时间,一方面是因为我们很难考虑执行算法的具体机器在各种操作上花费的时间(比如不同机器的运算速度不同,同一机器的初始化和赋值占用的时间应该也不一样),另一方面是我们很难…
在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #define SIZE 1000 //表达式的单个元素所使用的结构体 typedef struct elem { ; //若元素存储操作数则num为该操作数 char oper = '='; //若元素存储操作符则oper为该操作符 bool IsNum = false; //用于判断元素是否为操作数…
从这一篇博文开始,我们将开始讨论排序算法.所谓排序算法,就是将给定数据根据关键字进行排序,最终实现数据依照关键字从小到大或从大到小的顺序存储.而这篇博文,就是要介绍一种简单的排序算法--插入排序(Insertion Sort). 为了使精力专注于排序算法本身,而不是对数据的分析.处理,若无特殊说明,我们每一篇介绍排序算法的博文,均做如下假定: 1.数据存储于一个数组之中,且数据个数N即数组大小 2.数据类型即int 3.排序目标为从小到大 那么,插入排序是怎样的算法呢?其实插入排序的思想来源就是…
在讲解合并排序之前,我们先来想一想这样一个问题如何解决: 有两个数组A和B,它们都已各自按照从小到大的顺序排好了数据,现在我们要把它们合并为一个数组C,且要求C也是按从小到大的顺序排好,请问该怎么做? 这个问题非常容易解决,我们将A.B和C都视为队列,然后不断比较A和B的首部,取出其中更小的数据出队,然后将该数据插入队列C,若A或B有一方为空了,则将另一方数据顺序出队再插入C即可: ,j=,z=; while(i<a_size && j<b_size) { if(a[i]<…
在我们谈论本文具体内容之前,我们首先要说明一些事情.在现实生活中我们所说的"表"往往是二维的,比如课程表,就有行和列,成绩表也是有行和列.但是在数据结构,或者说我们本文讨论的范围内,我们所说的"表"是一维的,即所有"元素"都是前后排列的.就我个人而言,这样的"表"用"队列"来形容比较恰当.但是,数据结构中"队列"这个名词是被一种特殊的"表"给占用了的,所以我们没法再用…
在很多数据结构相关的书籍,尤其是中文书籍中,常常把数据结构与算法"混合"起来讲,导致很多人初学时对于"数据结构"这个词的意思把握不准,从而降低了学习兴趣和学习信心.然而实际上,数据结构就是其字面意思:数据的结构.而"结构"这个词的标准意思又是"组成整体的各部分的搭配和安排".所以,数据结构的意思就是"数据存储的结构",而我们学习数据结构其实就是为了研究"应该以什么样的(抽象的)结构存储数据&quo…