
数据结构
文章平均质量分 62
xddwz
这个作者很懒,什么都没留下…
展开
-
数据结构51:二叉堆的python实现
目录一、二叉堆操作的实现二叉堆初始化insert(key)方法delMin()方法一、二叉堆操作的实现二叉堆初始化采用一个列表来保存堆数据,其中表首下标为0的项无用,但为了后面代码可以用到简单的整数乘除法,仍保留它。class BinHeap: def __init__(self): self.heapList = [0] self.currentSize = 0insert(key)方法首先,为了保持“完全二叉树”的性质,新原创 2020-11-13 19:53:31 · 419 阅读 · 0 评论 -
数据结构50:二叉查找树及操作
目录一、二叉查找树Binary Search tree二、二叉查找树BST的性质三、二叉搜索树的实现“节点和链接结构一、二叉查找树Binary Search tree在ADT Map的实现方案中,可以采用不同的数据结构和搜索算法来保存和查找key,前面已经实现了两个方案:有序表数据结构+二分搜索算法 散列表数据结构+散列及冲突解决算法下面我们试试用二叉查找树保存key实现可以的快速搜索复习一下ADT Map的操作:Map():创造一个空映射 put(key, val):原创 2020-11-11 19:58:42 · 214 阅读 · 0 评论 -
数据结构49:优先队列与二叉树
目录一、优先队列Priority Queue二、二叉堆Binary Heap实现优先队列三、用非嵌套列表实现二叉堆四、完全二叉树的列表实现及性质五、堆次序Heap Order一、优先队列Priority Queue前面我们介绍了一种FIFO的数据结构:队列。队列有一种变体称为“优先队列”。例如,银行窗口取号排队,VIP客户可以插到队首。操作系统中执行关键任务的进程或者用户特别指定进程在调度队列中靠前。优先队列的出队跟队列一样从队首出队,但是在优先队列内部,数据项的次序却是原创 2020-11-11 10:46:22 · 789 阅读 · 0 评论 -
数据结构48:树的遍历
一、树的遍历Tree Traversals对一个数据集中的所有数据进行访问的操作称为“遍历Traversals”线性数据结构中,对其所有数据项的访问比较简单直接,按照顺序依次进行即可。但是由于树的非线性特点,使得遍历操作较为复杂。我们按照节点访问次序的不同来区分3种遍历。前序遍历(preorder):先访问根节点,再递归的前序访问左子树,最后前序访问右子树;中序遍历(inorder):先递归的中序访问左子树,再访问根节点,最后中序访问右子树;后续遍历(postorder):先递归的后原创 2020-11-05 20:04:51 · 304 阅读 · 0 评论 -
数据结构47:树的应用:表达式解析(二)
目录一、建立表达式解析树:实例二、利用表达式解析树求值:思路一、建立表达式解析树:实例全括号表达式:(3+(4*5))二、利用表达式解析树求值:思路从图示过程我们可以看到,创建树过程中关键的是对当前节点的跟踪: 创建左右子树可调用insertLeft/Right 当前节点设置值,可以调用setRootVal 下降到左右子树可以调用getLeft/RightChid 但是,上升到父节点,这个没有方法支持。 我们可以用一个栈来记录跟踪父节.原创 2020-11-02 20:28:11 · 913 阅读 · 0 评论 -
数据结构46:树的应用:表达式解析(一)
目录一、树的应用:解析树(语法树)二、树的应用:表达式解析创建表达式解析树过程:实例创建表达式解析树过程:规则一、树的应用:解析树(语法树)将树用于表示语言中句子,可以分析句子的各种语法成分,对句子的各种成分进行处理。语法分析树:主谓宾,定状补程序设计语言的编译:词法、语法的检查,从语法树生成目标代码 自然语言处理:机器翻译、语义理解二、树的应用:表达式解析我们还可以将表达式表示为树结构,叶节点保存操作数,内部节点保存操作符。全括号表达式((7+3)*.原创 2020-10-29 19:56:41 · 1053 阅读 · 1 评论 -
数据结构45:树的链表实现
实现树:节点链接法同样可以用节点链接法实现树每个节点保存根节点的数据项,以及指向左右子树的链接定义一个BinaryTree类,成员key保存根节点的数据项,成员left/rightChild则保存指向左/右子树的引用(同样是BinaryTree对象).代码实现:class Binarytree: def __init__(self, rootObj): self.key = rootObj # 根节点 self.leftChild =原创 2020-10-28 14:37:07 · 1060 阅读 · 0 评论 -
数据结构44:树的嵌套列表实现
首先我们尝试用python列表来实现二叉树数据结构。递归的嵌套列表实现二叉树,由具有3个元素的列表实现,[root, left, right]:第1个元素为根节点的值; 第2个元素为左子树(所以也是一个列表); 第3个元素为右子树(所以也是一个列表);以下图为例,一个6个节点的二叉树,根是myTree[0],左子树myTree[1],右子树myTree[2]嵌套列表的优点:子树的结构与树相同,是一种递归数据结构。 很容易扩展到多叉树,仅需要增加列元素即可。我们通过定义一系列函数原创 2020-10-27 16:53:18 · 589 阅读 · 0 评论 -
数据结构43:树结构相关术语
目录一、树结构相关术语二、树的定义1三、树的定义2(递归定义)一、树结构相关术语节点Node:组成树的基本部分。每个节点具有名称,或“键值”,节点还可以保存额外的数据项,数据项根据不同的应用而变。边Edge:边是组成树的另一个基本部分。每条边恰好连接两个节点,表示节点之间具有关联,边具有出入方向。 每个节点(除根节点)恰有一条来自另一节点的入边。 每个节点可以有多条连接到其它节点的出边。根Root:树中唯一一个没有入边的节点,路径Path:由边依次连接在一起的节点.原创 2020-10-26 18:55:43 · 988 阅读 · 0 评论 -
数据结构42:什么是树
目录一、什么是树二、树的例子一、什么是树树是一种非线性数据结构。树在计算机科学的各个领域中被广泛应用:操作系统、图形学、数据库系统、计算机网络。跟自然界的树一样,数据结构树也分为:根、枝、叶等三部分。一般数据结构的图示把根放在上方,叶放在下方。二、树的例子首先分类体系是层次话的。树是一种分层结构,越接近顶部的层越普遍,越接近底部的层越独特。 分类树的第二个特征:一个节点的字节点与另一个节点的字节点之间是隔离、独立的。 分类树的第三个特征:每一个节点都具有唯一性。生.原创 2020-10-23 16:17:45 · 968 阅读 · 0 评论 -
数据结构41:查找与排序小结
目录一、查找二、排序一、查找在有序表或者有序表上的顺序查找,其时间复杂度为O(n)。 在有序表上二分查找,其最差复杂度为O(log n)。散列表可以实现常数级时间的查找,完美散列函数作为数据一致性校验,应用很广。区块链技术是一种去中心化的分布式数据库,通过“工作量证明”机制来维持运行。二、排序冒泡、选择和插入排序的复杂度是O(n^2)。 谢尔排序在插入排序的基础上进行了改进,采用了对递增子表排序的方法,其时间复杂度可以在O(n)和O(n^2)之间。 归并排序的时间复.原创 2020-10-23 15:40:29 · 1259 阅读 · 0 评论 -
数据结构40:冲突解决方案
目录一、冲突解决方案二、线性探测Linear Probing三、线性探测的改进四、冲突解决方案:再散列rehasing五、冲突解决方案:数据项链Chaining一、冲突解决方案如果两个数据项被散列映射到同一个槽,需要一个系统化的方法在散列表中保存第二个数据项,这个过程称为“解决冲突”。前面提到,如果说散列函数是完美的,那就不会有散列冲突,但完美散列函数通常是不现实的。解决散列冲突称为散列方法中很重要的一部分。解决散列的一种方法就是为冲突的数据项再找一个开放的空槽来保.原创 2020-10-22 19:55:40 · 5369 阅读 · 0 评论 -
数据结构38:完美散列函数
目录一、完美散列函数二、完美散列函数的更多用途三、散列函数MD5/SHA四、python的散列函数库hashlib五、完美散列函数用于数据一致性校验一、完美散列函数给定一个数据项,如果一个散列函数能把每个数据项映射到不同的槽中,那么这个散列函数就可以称为“完美散列函数”。对于对丁的一组数据,总是能想办法设计出完美的散列函数。但是如果数据项经常性的变动,很难有一个系统性的方法来设计对应的完美散列函数。当然,冲突也不是致命性的错误,我们会有办法处理的。获得完美散列函数的.原创 2020-10-16 14:25:11 · 1327 阅读 · 0 评论 -
数据结构37:什么是散列
目录一、散列:Hashing二、散列表:基本概念三、散列:示例一、散列:Hashing前面我们利用数据集中关于数据项之间排列关系的知识,来将查找算法进行了提升。如果数据项之间是按大小排好序的话就可以利用二分查找来降低算法复杂度。现在我们进一步构造一个新的数据结构,能使得查找算法的复杂度降到O(1),这种概念称为“散列Hashing”能够使得查找的次数降到常数级别,我们对数据项所处的位置就必须有更多的先验知识。如果我们事先能知道数据项应该出现在数据集中的什么位置,就可以直.原创 2020-10-15 19:07:11 · 8699 阅读 · 3 评论 -
数据结构36:快速排序
目录一、快速排序二、快速排序:图示三、快速排序:算法分析一、快速排序快速排序的思路是依据一个“中值”数据项把数据表分为两半:小于中值的一半和大于中值的一半,然后每部分分别进行快速排序(递归)。如果希望这两半拥有相等数量的数据项,则应该找到数据表中的“中位数”,但是找中位数的过程需要计算开销,要想没有开销,只能随意找一个数充当中值,比如第一个数。快速排序的递归算法“递归三要素”为:基本结束条件:数据表仅有一个数据项,自然是排好序的。 缩小规模:根据“中值”,将数据表.原创 2020-10-14 19:42:02 · 219 阅读 · 0 评论 -
数据结构35:归并排序
一、归并排序本节讨论分治策略在排序中的应用。归并排序是递归算法,思路是将数据表持续分裂为两半,对两半分别进行归并排序。递归的基本结束条件是:数据项仅有一个数据项,自然是排好序的。缩小规模:将数据分裂为相等的两半,规模减为原来的二分之一;调用自身:将两半分别调用自身排序,然后将分别排好序的两半进行归并,得到排好序的数据表。代码:def merge_sort(lst): if len(lst) <= 1: return lst middl原创 2020-10-13 19:36:12 · 155 阅读 · 0 评论 -
数据结构34:谢尔排序
目录一、谢尔排序shell sort二、谢尔排序:思路三、算法分析一、谢尔排序shell sort我们注意到,对于插入排序的比对次数,在最好的情况下是O(n),这种情况发生在列表已经是有序的情况下,实际上,列表越是接近于有序,插入排序的比对次数就越少在这种情况下,谢尔排序以插入排序为基础,对无序表进行“间隔”划分子列表,每个子列表都执行插入排序。随着子列表的数量越来越少,无序表的整体越接近于有序,从而减少整体排序的比对次数。间隔为3的子列表,子列表分别插入排序后的整.原创 2020-10-12 18:52:30 · 744 阅读 · 0 评论 -
数据结构33:插入排序
目录一、插入排序二、算法思路三、算法分析四、代码一、插入排序插入排序的时间复杂度仍然是O(n^2),但是算法思路与冒泡排序、选择排序不同。插入排序是维持一个已排好序的字列表,其位置始终在列表的前部,然后逐步扩大这个子列表直到全表。二、算法思路第1趟,子列表仅包含一个数据项,将第二个数据项作为新项插入到子列表的合适位置,这样已排序好的列表就包含了2个数据项。 第2趟,再继续将第3个数据项跟前两个数据项比较,并移动比自身大的数据项,空出位置来,以便加入到子列表中。.原创 2020-09-28 19:08:58 · 203 阅读 · 0 评论 -
数据结构32:选择排序
选择排序Selection Sort选择排序对冒泡排序进行了改进,保留了其基本的多趟对比的思路,每趟都使当前最大项就位。但是选择排序对交换进行了削弱,每趟仅进行一次交换,记录最大项的所在位置,最后再跟本趟最后一项进行交换。选择排序的时间复杂度比冒泡排序稍优。对比次数不变,还是O(n^2)交换次数减少,为O(n)def selectSort(alist): for fillslot in range(len(alist)-1, 0, -1): positi原创 2020-09-27 20:22:59 · 157 阅读 · 0 评论 -
数据结构31:冒泡排序
目录一、冒泡排序Bubble Sort二、算法分析一、冒泡排序Bubble Sort冒泡排序的算法思路在于对无序表进行多趟比较交换,每趟包括了多次两两相邻比较,并将逆序的数据项交换位置,最终能将本趟的最大项就位。经过n-1趟比较,实现整表排序,每趟的过程类似于“气泡”在水中不断上浮到水面的经过。第一趟比较交换,共有n-1对相邻数据进行比较。一旦经过最大项,则最大项会一路交换到达最后一项。 第二趟比较交换是,最大项已经就位,需要排序的数据减少为n-1,共有n-2对相邻数据进行比较。.原创 2020-09-27 20:18:05 · 192 阅读 · 0 评论 -
数据结构30:二分查找及算法分析
目录一、二分查找二、二分查找代码三、二分查找:分而治之四、算法分析一、二分查找前面介绍了顺序查找,但是对于有序表,有没有更好更快的查找算法呢?在顺序查找中,如果第一个数据项比匹配查找项的话,那么最对还有n-1个待比对的数据项。那么是否可以利用有序表的特性,迅速缩小待比对数据项的范围呢?我们从列表的中间开始比对!如果列表中间的项匹配查找项,则查找结束 如果不匹配,那么就有两种情况:列表中间的项比查找项大,那么查找项就只可能出现在前半部分; 列表中间的项比查找项小.原创 2020-09-23 18:33:35 · 486 阅读 · 0 评论 -
数据结构29:顺序查找算法及分析
目录一、顺序查找Sequential Search二、算法分析三、顺序查找:无序表查找代码一、顺序查找Sequential Search如果数据项保存在如列表这样的集合中,我们会称这些数据项具有线性或者顺序关系。在python list中,这些数据项的存储位置称为下标,这些下标都是有序的整数。通过下标,我们可以按照顺序来访问和查找数据项,这种技术称为“顺序查找”。要确定列表中是否存在需要查找的数据项。首先从列表的第一个数据项开始,按照下标增长的顺序,逐个对比数据项,如果.原创 2020-09-21 20:15:50 · 2309 阅读 · 0 评论 -
数据结构26:找零兑换问题的递归解法
目录一、找零兑换问题:递归解法二、找零兑换问题:递归解法代码四、递归解法改进代码一、找零兑换问题:递归解法我们来找一种肯定能找到最优解的方法首先确定基本结束条件,兑换硬币这个问题最简单最直接的情况就是,需要兑换的找零,其面值正好等于某种硬币。其次是减小问题规模,我们要对每种硬币尝试一次,例如美元硬币体系:找零减去1分后,求兑换硬币最少数量(调用自身); 找零减去5分后,求兑换硬币最少数量; 找零减去10分后,求兑换硬币最少数量; 找零减去25分后,求兑换硬币最少数.原创 2020-09-20 15:47:52 · 1107 阅读 · 0 评论 -
数据结构25:优化问题和贪心策略
目录一、优化问题二、找零兑换问题三、贪心策略解决找零兑换问题四、贪心策略Greedy Method一、优化问题计算机科学中的许多问题都是为了找到某些问题的最优解例如,两点之间的最短路径;能最好匹配一系列点的直线;或者满足一定条件的最小集合;二、找零兑换问题一个经典的案例是找零兑换问题:假设你为一家自动售货机厂家编程序,自动售货机要每次找给顾客最少数量硬币:假设某次顾客投进$1(100penny)纸币,买了37penny的东西,要找63penny,那么最少的数.原创 2020-09-17 19:30:55 · 247 阅读 · 0 评论 -
数据结构22:递归的应用(汉诺塔问题)
一、汉诺塔问题汉诺塔问题是法国数学家Edouard Lucas于1883年提出的。传说在一个印度教寺庙里,有3根柱子,其中一根套着64个由小到大的黄金盘子,僧侣们的任务是要把这一叠黄金盘从一根柱子办到另一根,但是有两个规则:一次只能搬一个盘子 大盘子不能叠在小盘子上我们还是从递归三定律来分析这个问题:基本结束条件(最小规模问题)、如何减小规模,调用自身二、汉诺塔问题:分解为递归形式假设我们有5个盘子,穿在1#柱,需要挪到3#柱 如果能有办法把最上面的4个盘子统统挪到2#.原创 2020-09-14 20:02:36 · 471 阅读 · 1 评论 -
数据结构24:分治策略
目录一、分治策略二、递归算法与分治策略一、分治策略分而治之是解决问题的典型策略:将问题分为若干更小规模的部分。通过解决每一个小规模问题,并将结果汇总得到原问题的解。二、递归算法与分治策略递归三定律:基本结束条件,解决最小规模问题 缩小规模,向基本结束条件演进 调用自身来解决已缩小规模的相同问题体现了分治策略:问题解决依赖于若干缩小了规模的问题 汇总得到原问题的解应用相当广泛:排序、查找、遍历、求值等...原创 2020-09-13 17:06:29 · 201 阅读 · 0 评论 -
数据结构21:递归可视化(谢尔宾斯基三角形)
目录一、谢尔宾斯基Sierpinski三角形二、作图思路三、代码一、谢尔宾斯基Sierpinski三角形分形构造,平面称谢尔宾斯基三角形,立体称希尔宾斯基金字塔。下图中,根据自相似特性,希尔宾斯基三角形是由三个尺寸减半的谢尔宾斯基三角形按照品字形叠加而成。二、作图思路在degree有限的情况下,degree=n的三角形,是由3个degree=n-1的三角形按照品字形叠加而成。同时,这3个degree=n-1的三角形的变成均为degree=n的三角形的一半(规模减.原创 2020-09-10 19:42:18 · 2078 阅读 · 1 评论 -
数据结构20:递归可视化(分形树)
一、图示前面的递归算法展现了其简单而强大的一面,但还是难有个直观的概念,下面通过递归作图来展现递归调用的视觉影响力。1、python的海龟作图系统turtle modulepython内置,随时可用,以LOGO语言的创意为基础其意象是模拟海龟在沙滩上爬行而留下的足迹操作:爬行:forward(n), backward(n) 转向:left(a), right(a) 抬笔放笔:penup(a), pendown() 笔属性:pensize(n), pencolor(c).原创 2020-09-09 20:00:44 · 2491 阅读 · 0 评论 -
数据结构19:递归调用的实现
目录一、递归调用的实现二、python中的递归深度限制一、递归调用的实现当一个函数被调用的时候,系统会把调用时的现场数据压入到系统调用栈。每次调用时,压入的现场数据称为栈帧。当函数返回时,要从调用栈的栈顶取得返回地址,恢复现场,弹出栈帧,按地址返回。二、python中的递归深度限制在调试递归算法深度限制的时候,经常会碰到这样的错误:RecursionError这是因为:递归的层数太多,系统调用栈容量有限。这时候要检查程序中是否忘记设置结束条件,导致无限递归。.原创 2020-09-08 14:36:09 · 844 阅读 · 0 评论 -
数据结构18:递归的应用(1):任意进制转换
前面讨论过这个算法,这里考虑用递归的方法实现。首先我们用最熟悉的十进制分析这个问题十进制有十个不同的符号:convString='0123456789',比10小的数转换成十进制,直接查表就可以:convString[n],那么比10大的整数该怎么解决呢?根据递归三定律,我们找到基本结束条件,就是小于10的整数,拆解整数的过程就是向基本结束条件演进的过程。我们用整数除和求余数两个计算来将整数一步步拆开。除以“进制基”(//base) 对“进制基”求余数(%base)问题就分解为:原创 2020-09-07 18:45:54 · 641 阅读 · 0 评论 -
数据结构17:什么是递归
一、什么是递归(Recursion)?递归是一种解决问题的方法,其主要思想在于:将问题分为规模更小的相同问题 持续分解,直到问题规模小到可以用非常简单直接的方式来解决递归问题的分解方式非常独特,其算法方面的明显特征就是:在算法流程中调用自身。递归为我们提供了一种对复杂问题的优雅解决方案,精妙的递归算法常会出奇简单,令人赞叹。二、初始递归:数列求和问题问题:给定一个列表,返回所有数的和。列表中数的个数不定,大家可能很容易的想到用一个循环和一个累加变量迭代的实现,如下代码:def...原创 2020-09-06 19:45:11 · 13149 阅读 · 2 评论 -
数据结构16:线性结构小结
一、线性结构线性数据结构将数据项以线性的次序组织起来二、栈栈Stack维持了数据项后进先出LIFO的次序 栈的基本操作包括push,pop,isEmpty 书写表达式的方法有前缀prefix、中缀infix和后缀postfix三种 由于栈具有反转次序的特性,所以栈结构适用于开发表达式求值和转换的算法三、队列队列Queue维持了数据项先进先出FIFO的次序 queue的基本操作包括enqueue,dequeue,isEmpty 双端队列Deque可同时具备队列和栈的功能 dequ原创 2020-09-03 10:00:01 · 314 阅读 · 0 评论 -
数据结构15: 有序表抽象数据类型
目录一、什么是有序表orderedlist ?二、orderedlist定义的操作1、search方法2、add方法3、所有代码四、链表实现的算法分析一、什么是有序表orderedlist ?有序表是一种数据项依照某种可比性质(如整数大小、字母表先后)来决定在列表中的位置。越小的数据项越靠近列表的头,越靠前。二、orderedlist定义的操作有序表数据定义的操作如下:List(): 创建一个空的有序表add(item): 添加一个数据项到列表中.原创 2020-08-31 20:27:51 · 633 阅读 · 0 评论 -
数据结构14:无序表抽象数据类型(链表)(二)
一、无序表unorderlist的链表实现1、无序表的add方法接下来考虑如何向无序表中添加数据项,实现add方法。由于无序表并没有限定数据项之间的顺序,因此新的数据项可以添加到原表的任何位置。按照实现的性能考虑,我们首先想到的肯定是最容易加入的位置。那么,哪里是最容易加入的位置呢?由链表的结构我们知道,要访问到整条链上的所有数据项,都必须从表头的head开始,沿着next链接逐个向后查找,所以添加数据项最快捷的位置是表头,也就是整个链的首位置。代码实现: def add原创 2020-08-30 17:05:45 · 341 阅读 · 0 评论 -
数据结构13:无序表抽象数据类型(链表)(一)
一、什么是无序表在前面基本数据结构的讨论中,采用python list实现了多种线性数据结构,主要包括栈、队列、双端队列,可以发现列表list是一种简单强大的数据集结构,提供了丰富的操作接口。什么是列表呢?列表其实是一种数据项按照相对位置存放的数据集。特别的,被称为“无序表(unordered list)”,其中的数据项只按照存放位置来索引,如第一个、第二个等(这里假设表中不存在重复的数据项)。例如一个考试分数的集合“54,26,93,17,77,31”,如果用无序表来表示的话,就是[54原创 2020-08-29 22:20:15 · 881 阅读 · 0 评论 -
数据结构12:双端队列与回文词判定
目录一、什么是双端队列二、双端队列Deque定义的操作:三、双端队列的python实现四、回文词判定五、回文词判定代码实现一、什么是双端队列双端队列Deque是一种有序的数据集跟队列相似,其两端可以称为“首端”与“尾端”,区别是:双端队列Deque中数据项可以从队首加入,也可以从队尾加入,数据项也可以从两端移除。因此,从某种意义上说,双端队列集成了栈和队列的能力。双端队列不具有内在的“后进先出”或者“先进先出”的特性,如果用双端队列来模拟栈或者队列,需要由使用者.原创 2020-08-28 18:45:57 · 677 阅读 · 0 评论 -
数据结果11:队列的应用(热土豆问题)
热土豆问题(击鼓传花的土豆版本)传烫手的热土豆,鼓声停的时候,手里有土豆的小孩出列。如果去掉鼓,改为传过固定人数,就成了“现代版的”约瑟夫问题。算法用队列来实现热土豆问题的算法,参加游戏的人名列表,以及传土豆次数,算法返回最后剩下的人名。实现过程:程序采用队列来存放所有参加游戏的人名,按照传递土豆方向排到队尾 游戏开始,只需要将队首的人出队,随即再到队尾入队,就完成了土豆的一次传递在游戏的过程中,队首始终是持有土豆的人。传递num次之后,将队首的人移除,不在乎入队,如此反复原创 2020-08-27 18:52:33 · 1046 阅读 · 0 评论 -
数据结构10:队列抽象数据类型
一、什么队列队列是有次序的数据集合,其特征是:新数据项的添加总发生在一端,通常称为“尾rear端” 现存数据的一处总发生在另一端,通常称为“首front端”当数据项加入队列时,首先出现在队尾,随着队首数据项的移除,它逐渐接近队首。新加入的数据项必须在数据集的末尾等待,而等待时间最长的数据项则是队首,这种次序安排的原则称为FIFO(First-in-first-out),队列仅有一个出口和一个入口:不允许数据项直接插入队列中,也不允许从中间移除数据项。生活中常见的队列:打印机的打印队列、进原创 2020-08-26 18:45:00 · 1815 阅读 · 0 评论 -
数据结构9:后缀表达式求值
前面介绍了中缀表达式转化为后缀表达式,那么后缀表达式怎么求值的呢?一、算法原理与中缀转化为后缀的问题不同,在对后缀表达式从左到右扫描的过程中,由于操作符在操作数的后面,所以要暂存操作数,碰到操作符的时候,再把暂存的两个操作数取出来,进行实际的计算。仍然是栈的特性:操作符之作用于与它最近的两个操作数。如“456*+”:先扫描到4和5两个操作数,但是此时不知道这两个操作数要进行什么样的操作,所以暂存起来。 继续扫描,碰到了操作数6,还是不知道怎么计算,仍然暂存。 直到“*”,现在知道是栈原创 2020-08-26 17:34:25 · 3463 阅读 · 0 评论 -
数据结构8:表达式转换(二)
目录通用的中缀转换后缀算法A+B*C(A+B)*C算法流程代码实现通用的中缀转换后缀算法先来说一下“通用”是什么意思。上一节说到,我们在把中缀表达式转化为前缀后缀表达式的时候需要先把中缀表达式转化为全括号的形式,有的小伙伴可能会觉得有点麻烦,那么是不是可以跳过这一步呢?当然是可以的,这就是“通用”的转化算法。A+B*C首先我们看中缀表达式A+B*C,它的后缀表达式是什么呢?很简单,是ABC*+,在这里,大家观察: 操作数ABC的顺序没有改变。 .原创 2020-08-25 20:57:50 · 360 阅读 · 0 评论