- 博客(44)
- 收藏
- 关注
翻译 《大话数据结构》
总结回顾又到了总结回顾的时间。我们这一章讲的是栈和队列,它们都是特殊的线性表,只不过对插入和删除操作做了限制。栈( stack )是限定仅在表尾进行插入和删除操作的线性表。队列(queue是只允许在一端a韭行插入操作,而在另一端进行删除操作的线性表、它们均可以用线性:表的顺序存储结构来实现,但都存在着顺序存储的一些弊端、因此它们各自有各自的技巧来解决这个间题。讨于伐来说
2016-11-02 13:59:47
328
翻译 《大话数据结构》
循环队列定义所以解决假溢出的办法就是后面满了,就再从头开始,也就是头尾相接的循环。我们把队列的这种头尾相接的顺序存储结构称为循环队列。刚才的例子继续,图 4 12 5 的rear可以改为指向下标为0的位置,这样就会造成指针指向不明的问题了,如图 4 12 6所示、接着入队a 6,将他/它放置于下表为0处,rear 指针指向下表为1处,如图 4 12 7的左图所示、若再入
2016-11-02 13:58:08
353
翻译 《大话数据结构》
队列的抽象数据类型同样是线性表,队列也有类似线性表的各种操作,不同的就是插人数据只能在队尾进行,删除数据只能在队头进行、 循环队列线性表有顺序存储和链式存储,栈是线性表,所以有这两种存储方式。同样,队列作为一种特殊的线性表,一也同样存在这两种存储方式。我们先来看队列的顺序存储结构。队列顺序存储的不足我们假设一个队列有n个元素,则顺序存储的队列
2016-11-02 13:56:47
365
翻译 《大话数据结构》
队列的定义你们在用计算机时有没有经历过,机器有时会处于疑似死机的状态,鼠标点什么似乎都没用,双击任何快捷方式都不动弹。就当你失去耐心,打算reset时。突然它像酒醒了,样,把你刚才点击的所有操作全部都按顺序执行了一遍。这其实是因为操作系统中的多个程序因需要通过一个通道输出,而按先后次序排队等待造成的。再比如像移动、联通、电信等客服电话,客服人员与客户相比总是少数,在所有的客服人员都f=}
2016-11-02 13:56:04
290
转载 《大话数据结构》
中缀表达式转后缀表达式我们把平时所用的标准四则运算表达式、即"9+ (3一1) x3+10=2’叫做中缀表达式。因为所有的运算符号都在两数字的中I}}J ,现在我们的问题就是中缀到后缀的转化目中缀丧达式}5}+(3一}] x 3+1}=2”转化为后缀表达式“931一3*+1} 2/十u+ o规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符
2016-11-02 13:55:28
297
翻译 《大话数据结构》
后缀表达式计算结果为了解释后缀表达式的好处,我们先来看看,计算机如何应用后缀表达式计算出最终的结果as的。后缀表达式:}}z一3*+102/+规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处一十栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。1.初始化一个空栈。此栈用来对要运算的数字进出使用。如图 491 的左图、2.后缀表达式中前三个都
2016-11-02 13:54:51
242
翻译 《大话数据结构》
栈的应用·····四则运算表达式求值后缀(逆波兰)表示法定义栈的现实应用也很多,我们再来重点讲一个比较常见的应用:数学表达式的求值、我们小学学数学的时候,有一句话是老师反复强调的,“先乘除,后加减,从左算到右,先括号内后括号外”。这个大家都不陌生。我记得我小时候,天天做这种加减乘除的数学作业,很烦、于是就偷偷拿了老爸的计算器来帮着算答案,对护单纯的两个数的加减乘除,的确是省心不
2016-11-02 13:54:18
226
翻译 《大话数据结构》
栈的应用····递归栈有一个很重要的应用:在程序设计语言中实现了递归。那么什么是递归呢?当你往镜子前面一站,镜子里面就有一个你的像。但你试过两面镜子一起照吗?如果A, B两面镜子相互面对面放着,你往中间一站,嘿,两面镜子里都有你的千百个“化身”。为什么会有这么奇妙的现象呢?原来,A镜子里有B镜子的像,B镜子里也有A镜子的像,这样反反复复,就会产生一连串的“像中像”。这是一种递归现象、如下图
2016-11-02 13:53:02
372
翻译 《大话数据结构》
栈的作用有的同学可能会觉得,用数组或链表直接实现功能不就行了吗?干吗要引入栈这样的数据结构呢?这个问题问得好。其实这和我们明明有两只脚可以走路,干吗还要乘汽车、火车、飞机一样。理论上,陆地上的任何地方,你都是可以靠双脚走到的,可那需要多少时间和精力呢?我们更关注的是到达而不是如何去的过程。栈的引入简化了程序没计的问题,划分了不同关注层次,使得思考范围缩小,更加聚焦十我们要解决的问题核心。反
2016-11-02 13:52:19
214
翻译 《大话数据结构》
栈的链式存储结构及实现栈的链式存储结构讲完了栈的顺序存储结构,我们现在来看看栈的链式存储结构,简称为链栈。想想看,栈只是栈顶来做插入和删除操作,栈顶放在链表的头部迁是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢,所以比较好的办法是把栈顶放在单链表的头部(如下图所示)。另外,都已经有了栈顶在头部了。单链表中比较常用的头结点也就失去了意义,通常对卜链栈来说
2016-11-02 13:51:15
273
翻译 《大话数据结构》
栈的顺序存储结构及实现栈的顺序存储结构既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈。线性表是用数组来实现的,想想看,对于栈这种只能,头插入删除的线性表来说,用数组哪一端来作为栈顶和栈底比较好?对,没错,下标为O的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底。我们定义一个top变歇来指示栈顶元素在数组中的位置,这top就如
2016-11-02 13:50:35
203
翻译 《大话数据结构》
栈的抽象数据类型对于栈来讲 ,理论上线性表的操作特性它都具备,}叮由丁它的特殊性,所以针对它在操作i-:会有些变化。是插入和删除操作,我们改名push和PvP}英文直i}的i}是压和弹,更容易理解。你就把它当成是弹夹的子弹压入和弹出就好i己忆厂,我们一般!]味进栈和出栈。由于栈木身就是一个线性表,那么上一章我们讨论了线性表的顺序存储和链式存对于栈来说也是同样适用的
2016-11-02 13:49:25
295
翻译 《大话数据结构》
进栈出栈变化形式现在我耍问间大家,这个最先进栈的元素,是不是就只能是最后出栈呢、答案是不一定,要看不}·么情况。栈对线性表的插入和删除的位置进行了限制,并没有对元素进出的时间进行限制,也就是说,在不是所有元素都进栈的情况卜,事先进去的元索也可以出浅,只要保证是栈顶兀素出栈就可以。举例来说,如果我们现在是有3个枯型数字元素I. 2, 3依次进栈,会有哪些出浅次序呢、·第一种:1、2、
2016-11-02 13:48:53
270
翻译 《大话数据结构》
栈与队列栈与队列:栈是限定仅在表尾进行插入和删除操作的线性表口.队列是只允许在一端进行插入操作、而在另一端进行删除操作的线性表口.栈的定义好了,说这个例子目的不是要告诉你们我当年有多笨,而是为了引出今天的主题,就是类似弹夹中的子弹一样先进去,却要后出来,而后进的,反而以先出来的数据结构,一一栈。在我们软件应用中,栈这种后进先出数据结构的应用是1狂常普遍的
2016-11-02 13:48:03
224
翻译 《大话数据结构》
双向链表继续我们刚才的例子,你平时都是从_h海一路停留到北京的,可是这一次,你得先到北京开会,谁叫北京是首都呢,会就是多。开完会后,你需要例行公事,走访齐个城市,此时你怎么办、有人又出主意了,你可以先回上海,一路再乘火车走遍这几个城市,到了北京后,你再飞回上海。你会感慨,人生中为什么总会有这样出主意的人存在呢?真要气死人才行。哪来这么麻烦,我一路从北京坐火车或汽车回去不就完
2016-11-02 13:46:51
308
翻译 《大话数据结构》
循环链表在座的各位都很年轻,不会觉得日月如梭。可上了点年纪的人,比如我—的父辈们,就常常感慨,要是可以回到从前该多好二网上一也盛传,所谓的成功男人就是3岁时不尿裤子,5岁能自己吃饭......80岁能自已做饭,90岁能不尿裤子。对于单链表,山于每个结点只存储了向后的指针、到了尾标志就停止了向后链的操作,这样,当中某一结点就无法找到它的前驱结点了,就像我们刚才说的,不能回到从前。比如,你是一
2016-11-02 13:45:50
248
翻译 《大话数据结构》
静态链表的删除操作故事没完,接着,排在第一个的甲突然接到一电话。看着很急,多半不是家里右紧急情况,就是单位有突发状况,反止稍有犹豫之后就急匆匆离开口这意味着第一位空出来了,那么自然冈l]才那个收了好处的乙就成了第一位—有人走运起来,喝水都长肉。和前面一样,侧除元素时,原来是需要释放结点的函数free‘)。现在我们也得自己实现它:有了刚才的基础,这段代码就很容易理解了。前
2016-11-02 13:44:55
252
翻译 《大话数据结》
静态链表的插入操作现在我们来肴看如何实现元素的插入。静态链表中要解决的是:如何用静态模拟动态链表结构的存储空间的分配,需要时申请,J}用时释放。我们前面说过,在动态链表中,结点的申请和释放分别借用malbe()和freeO两个函数来实现。在静态链表中,操作的是数组,不存在像动态链表的结点中请和释放问题,所以我们需要自己实现这两个函数,才可以做插人和删除的操作。为了辨明数组中哪些分量未被
2016-11-02 13:43:59
242
翻译 《大话数据结构》
静态链表其实C语言真是好东西,它具有的指针能力、使得它可以非常容易地操作内存中的地址和数据,这比其他高级语言更加灵活方便。后来的面向对象语言,如]a}a, C#等,虽不使用指针,但因为启用厂对象引用机制,从某种角度也间接实现了指针的某些作用。但对于一些语言,如Hasie, Fortran等旱期的编程高级语言,由十没有指针、链表结构按照前面我们的讲法,它就没法实现了。怎么办呢?有人就
2016-11-02 13:43:16
327
翻译 《大话数据结构》
单链表的整表删除当我们不打算使用这个单链表时,我们需要把它销毁,其实也就是在内存中将它释放掉,以便于留出空间给其他程序或软件使用。单链表整表删除的算法思路如一巳1.声明一结点p和q.2.将第一个结点赋值给p.3.循环.·将下一结点赋值给q。·释放p。·q赋值给p。这段算法代码里,常见的错误就是有同学会觉得q变量没有存在的必要。在循环体内直接写 fre
2016-11-02 13:41:55
253
翻译 《大话数据结构》
单链表的整表创建回顾一下,顺序存储结构的创建,其实就是一个数组的初始化,即声明一个类型和大小的数组并赋值的过程;If}l单链表和顺序存储结构就不一样,它不像顺序存储结构这么集中,它可以很散,是一种动态结构。对于每个链表来说,它所占用空间的大小和位置是不需要预先分配划定的,可以根据系统的悄况和实际的需求即时生成。所以创建单链表的过程就是,个动态生成链表的过程二即从“空表”的初始状
2016-11-02 13:41:18
165
翻译 《大话数据结构》
单链表的删除现在我们再来看单链表的删除。设存储元素a i 的结点为 q .要实现将结点 q 单链表的操作,其实就是将它的前继结点的指针绕过,指向它的后继结点即可我们所要做的,实际上就是一步,p-next=p-next next,用q来取代p - >next,即是q=p -> next ; p -> next = q -> next;解读这两句代码,也就是说让p的后继的后继结点
2016-11-02 13:40:36
186
翻译 《大话数据结构》
单链表的读取在线性表的顺序存储结构中,我们要计算任意一个元素的存储位置是很容易的。但在单链表中,由丁几第i个元素到底在没办法一开始就知道,必须得从头开始找。因此,对十单链表实现获取第i个元素的数据的操作GetElem,在算法,上、相对要麻烦一些。获得链表第i个数据的算法思路: 1.声明一个结点P指向链表第一个结点,初始化1从1开始。 2.当i时,就遍历链表,让p的指
2016-11-02 13:39:23
330
翻译 《大话数据结构》
线性表的链式存储结构顺序存储结构不足的解决方法前面我们讲的线性表的顺序存储结构。它是有缺点的,最大的缺点就是插入和删除时需要移动大R元素,这显然就需要耗费时间。能不能想办法解决呢 要解决这个问题,我们就得考虑一下导致这个问题的原因。为什么当插入和删除时,就要移动大量元素,仔细分析后,发现原因就在于相邻两元素的存储位置也具有邻居关系二它们编号是1, 2, 3,···,n、它们在内存中的位置也
2016-10-31 14:40:49
222
翻译 《大话数据结构》
顺序存储结构的插入与删除获得元素操作对于线性表的顺序存储结构来说,如果我们要实现 GetElem 操作,即将线性表L中的第 i 个位置元素值返回,其实是非常简单的。就程序而言,只要 i 的数值在数组下标范围内,就是把数组第 i - 1 下标的值返回即可。注意这里返回值类型 Status 是一个整型,返回值 OK 代表 1,ERROR 代表 0。 之后代码中出现就不再详述。插
2016-10-31 14:39:26
273
翻译 《大话数据结构》
地址计算方法由于我们数数都是从1开始数的,线性表的定义也不能免俗,起始也是1可C语言中的数组却是从0开始第一个下标的,于是线性表的第i个元素是要存储在数组下标为 i-1 的位置,即数据元素的序号和存放它的数组下标之间存在对应关系 用数组存储顺序表意味着要分配因定长度的数组空间,由于线性表中可以进行插入和删除操作,因此分配的数组空间要大于等于当前线性表的民度。其实,内存中的地址,就和图书
2016-10-31 14:38:42
197
翻译 《大话数据结构》
顺序存储方式 线性表的顺序存储结构,说白了,就和刚才的例子一样,就是在内存中找了块地儿,通过占位的形式,把一定内存空间给占了,然后把相同数据类型的数据元素依次存放在这块空地中。既然线性表的每个数据元素的类型都相同,所以可以用C语言(其他语言也相同)的一维数组来实现顺序存储结构,即把第一个数据元素存到数组下标为0的位置中,接着把线性表相邻的元素存储在数组中相邻的位置二我那同学占座时,如果图书
2016-10-31 14:37:37
184
翻译 《大话数据结构》
线性表的顺序存储结构顺序存储定义:说这么多的线性表,我们来看看线性表的两种物理结构的第一种—顺序存储结构。线性表(a1,a2,······,a n )的顺序存储示意图如下: 我们在第一课时已经讲过顺序存储结构二今天我再举一个例广二记得大学时,我们同宿舍有一个同学,人特别老实、热心,我们时常会让他帮我们去图书馆占座,他总是答应,你想想,我们一个宿舍连他共有九人
2016-10-30 20:19:18
175
翻译 《大话数据结构》
线性表的抽象数据类型前面我们已经给了线性表的定义,现在我们来分析一下,线性表应该有一些什么样的操作呢?还是回到刚才小朋友的例子,老师为了让小朋友有秩序的粗鲁,所以就考虑给它们排一个队,并且是长期使用的顺序,这个考虑和安排的过程其实就是一个线性表的创建和初始化过程。一开始没经验,把小朋友排好队后,发现有的高有的矮,队伍很难看,于是就让小朋友解散重新排,这是一个线性表重置为空表的操作。拍好
2016-10-30 20:16:45
705
翻译 《大话数据结构》
线性表线性表,从某种就能感觉到,是具有像线一样的性质的表。在广场上,有很多人分散在各处,当中有些是小朋友,可也有很多大人,甚至还有不少宠物,这些小朋友的数据对整个广场人群来说,不能算是线性表的结果。但像刚才提到的那样,一个班级的小朋友,一个跟着一个排着队,有一个打头,有一个收尾,当中的小朋友,每一个都知道他前面一个是谁,他后面一个是谁,这样犹如一根线把他们串联起来了,就可以称之
2016-10-30 20:08:49
297
翻译 《大话数据结构》
算法空间复杂度我们在写代码时,完全可以用空间来换取时间,比如说要判断某某年是不是闰年,你可能会花一点心思写了一个算法,而且由于是一个算法,也就意味着,每次给一个年份,都是要通过计算得到是否是闰年的结果。还有另一个方法就是,实现建立一个有2050个元素的数组(年数略比现实多一点),然后把所有的年份按下标的数字对应,如果是闰年,此数组项的值就是 1,如果不是值为 0。这样,所谓的判断某一年
2016-10-30 20:08:15
218
翻译 《大话数据结构》
算法的定义算法是解决特定问题求解步骤的描述,在计算机中为指令的有限序列,并且每条指令表示一个或多个操作。算法的特性有穷性、确定性、可行性、输入、输出。算法的设计的要求正确性、可读性、健壮性、高效率和低存储量需求。算法特性与算法设计容易混,需要对比记忆。算法的度量方法事后统计方法(不科学、不准确)
2016-10-30 20:06:58
124
翻译 《大话数据结构》
最坏情况与平均情况你早晨上班出门后突然想起来,手机忘记带了,这年头,钥匙,钱包,手机三大件,出门那样都不能少啊。于是回家找,打开门一看,手机就在门口玄关的台子上。原来是出门穿鞋时忘记拿了。这当然是比较好,基本没花什么时间寻找。可如果不是放在那里,你就得进去到处找,找完客厅找卧室,找完卧室找厨房、找完厨房找卫生间,就是找不到,,时间一分一秒的过去,你突然想起来可以用家里座机打一下手机,听
2016-10-30 14:57:04
128
翻译 《大话数据结构》
常见的时间复杂度常见的时间复杂度如下图所示 常用的时间复杂度所耗费的时间从小到大依次是:O(1) 我们前面已经谈到了 O(1)常数阶、O(logn)对数阶、O(n)线性阶、O(n²)平方阶等,至于O(nlogn)我们将会在今后的课程中介绍,而像O(n 三次方)过大的 n 都会使得结果变得不现实,同样指数阶 O(2 n次方)和阶乘阶 O(n!)等除
2016-10-30 14:55:11
194
翻译 《大话数据结构》
推导大O阶方法那么如何分析一个算法的时间复杂度呢?即如何推导大O阶呢?我们给出了下面的推导方法,基本上,这也就是总结前面我们举的例子。 仿佛像是得到了游戏攻略一样,我们好像已经得到了一个推到算法时间复杂度的万能公式。可事实上,分析一个算法的时间复杂度,没有这么简单,我们还需要多看几个例子常数阶首先顺序结构的时间复杂度。下面这个算法,也就是刚才的第二种算法
2016-10-30 14:52:11
260
翻译 《大话数据结构》
函数的渐进增长我们现在来判断一下,两个算法A和B哪个更好。假设两个算法的输入规模都是n,算法A要做2n+3次操作,你可以理解为先有一个n次的循环,执行完成后,再有一个n次循环,最后有三次赋值或运算,共2n+3次操作。算法B要做3n+1次操作,你觉得它们谁更快呢准确来说,答案是不一定的 当n=1时,算法A效率不如算法B(次数比算法B要多了一次)。而但n = 2时,两者效率相同
2016-10-30 14:51:23
292
翻译 《大话数据结构》
算法效率的度量方法刚才我们提到设计算法要提高效率。这里效率大都指算法的执行时间。那么我们如何度量一个算法的执行时间呢?正所谓是骡子是马拉出来溜溜,我们通过对算法的数据测试利用计算机的计时功能,来计算不同算法的效率是高还是低。事后统计方法这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确
2016-10-30 14:50:33
283
翻译 《大话数据结构》
算法定义什么是算法呢,算法是描述解决问题的方法。算法这个单词最早出现在波斯数学家阿勒·花刺子密在公园825年所写的印度数字算术中,如今普遍认可的对算法的定义是:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。刚才的例子我们也看到,对于给定的问题,是可以有多种算法解决的。现实世界中的问题千奇百怪,算法当然也就千变万化,没有通用的算
2016-10-29 19:55:23
439
翻译 《大话数据结构》
数据结构与算法关系我们这门课程叫数据结构,但很多时候我们会讲到算法,以及它们之间的关系。打个比方,今天是你女友生日,你打算请女友去看爱情音乐剧,到了戏院,抬头一看 《梁山伯》18:00开演,嗯,怎么会是这样呢,一问才知道,今天饰演祝英台的演员生病了,所以梁山伯唱独角戏。真是搞笑了,这还有什么看头。事实上,数据结构和算法也是类似的关系,只谈数据结构,当然是可以,我们可以在很短
2016-10-29 19:54:00
200
翻译 《大话数据结构》
抽象数据类型我们对已有的数据类型进行抽象,就有了抽象数据类型抽象数据类型:是指一个数学模型及定义在该模型上的一组操作。抽象数据类型的定义取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。比如刚才的例子,各个计算机,不管是大型机小型机,PC,平板电脑,PDA,甚至智能手机都拥有整数类型,也需要整数间的运算,那么整型其实就是一个抽象数据类型,尽管它在上面提到的这些在不同
2016-10-29 19:51:56
198
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅