北航数据结构课件 (8)
- 格式:pdf
- 大小:957.46 KB
- 文档页数:99
实验报告:栈实现逻辑关键词求值17374347周京成一、问题描述逻辑关键词求值是程序设计语言中的一个基本问题,简单说就是让计算机理解并且接受高级语言描述的概念,这里的处理对象是“”,代表和;“v”代表并;,“~”代表非;“_”代表蕴含;“-”代表当且仅当;“(”,“)”左右括号;以及代表Ture 的数字1和代表False的0按照一定规则构成的合法式子,由于各种运算之间有优先级关系,所以用括号来隔开,所以使用栈来求逻辑表达式的值,这里我们最好输出的是True和False,为了方便,输入的数字只有1和0.二、数据结构:栈由于使用的是python语言,可以不用直接构造一个栈结构,直接使用列表,就可以实现栈的各类操作,比如进栈,出栈等等。
三、算法的设计和实现:1.首先建立两个列表,分别存储读入的数字和字符2.读入数字和字符,当读入右括号“)”,则要计算这个括号里面的运算结果,存储在数字列表中。
3.最后只剩下最多一个字符和两个数字,再进行讨论既可。
四、预期结果与问题预期结果和我们自己运算应该是一致的,例如(~(1_0))^((1v0)-1)=True一般可能的问题:1.在表达式最外面加括号,例如(1^0),则需要判断字符列表是不是为空,来判断这种情况。
2.只数字列表只剩一个数字,这时候也要判断字符列表是不是空,最好再输出。
附:python代码:str1=input()list1=[]//字符列表list2=[]//数字列表for i in str1:if i.isdigit()==True:list2.append(int(i))//判断是不是数字else:if i!=")":list1.append(i)//不是右括号存储else:last=list1.pop()//右括号进行计算,各种栈操作while(last!="("):if last=="^":list2.append(list2.pop() and list2.pop())if last=="v":list2.append(list2.pop() or list2.pop())if last=="~":list2.append(not list2.pop())if last=="_":if (not list2.pop()) and (list2.pop())==True: list2.append(0)else:list2.append(1)if last=="-":if (list2.pop()+list2.pop()) in [0,2]:list2.append(1)else:list2.append(0)last=list1.pop()if list1==[]:print (bool (list2.pop()))//判断字符列表是否为空 else : //输出if list1[0]=="^":print (bool (list2.pop() and list2.pop())) if list1[0]=="v":print (bool (list2.pop() or list2.pop())) if list1[0]=="~":print (bool (not list2[0]))if list1[0]=="_":if (not list2.pop()) and list2.pop()==True : print (False )else :print (True )if list1[0]=="-":if (list2.pop()+list2.pop()) in [0,2]: print (True ) else :print (False )输出样例:中国剩余定理(简单写下):我们只做对于有限多个质数的同余方程组。
1概述28.2 错误分类34错误的诊察和报告5678错误处理技术910(2) 错误局部化处理的实现(递归下降分析法) cx: 全局变量,存放错误信息。
•用递归下降分析时,如果发现错误,便将有 关错误信息(字符串或者编号)送CX,然后转出 错误处理程序; •出错程序先打印或显示出错位置以及出错信息, 然后跳出一段源程序, 直到跳到语句的右界符 (如:end)或正在分析的语法成分的合法后继符号 为止, 然后再往下分析。
北京航空航天大学计算机学院11例:条件语句分析: 有如下分析程序:if<B> then <stmt>[else< stmt >];procedure if_stmt; begin nextsym; B; if not class=‘then’ then begin cx :=‘缺then’ error; end; else begin nextsym; statement end; if class=‘else’then begin nextsym; statement; end end if_stmt; 北京航空航天大学计算机学院/*读下个单词符号*/ /*调用布尔表达式处理程序*//*错误性质送cx*/ /*调用出错处理程序*/12局部化处理的出错程序为: procedure error; begin write(源程序行号, 序号, cx) repeat nextsym; until class = ‘;’ or class = ‘end’ or class = ‘else’ end error; 跳过太多real x, 3a, a, bcd, 2fg;北京航空航天大学计算机学院 13(3) 提高错误局部化程度的方法 设 S1: 合法后继符号集 (某语法成分的后继符号) S2: 停止符号集 (跳读必须停止的符号集)进入某语法成分的分析程序时: S1:= 合法后继符号 S2:= 停止符号北京航空航天大学计算机学院14当发现错误时: error(S1,S2) procedure error(S1,S2) begin write(line_no, char_no, cx); repeat nextsym until(class in S1 or class in S2 ); end if<B> then <stmt>[else< stmt >] 若<B>有错,则可跳到then, 若<stmt>有错,则可跳到else。
第八章图8.1 图的基本概念8.2 图的存储方法本章讨论的主要内容8.1图的基本概念一.图的定义(1) 用图形(2) 用符号(3)用语言顶点v i 与v j 是这条边的两个邻接点。
关于一条边或弧的表示(vi , v j ) 或<v i , v j >v i v j v iv j顶点偶对其中V 2 = { v 1, v 2, v 3, v 4 }E 2 = { <v 1,v 2>, <v 2,v 1>,<v 2,v 3>, <v 4,v 3> }G 1=(V 1, E 1)对于(vi ,v j)∈E,必有(vj,vi)∈E,并且偶对中顶点的前后顺序无关。
若<vi ,v j>∈E是顶点的有序偶对。
无向图有向图网(络)与边有关的数据称为,边上带权的图称为。
权网络v1v2v3v4无向图有向图网(络)二.图的分类1.顶点的度对于有向图而言, 有:顶点的:以顶点v i 为出发点的边的数目,记为OD(v i )。
顶点的:以顶点v i 为终止点的边的数目,记为ID(v i )。
TD(v i ) = OD(v i ) + ID(v i )出度入度v 1v 2v 3v4具有n 个顶点的有向图最多有n(n -1)条边。
具有n 个顶点的无向图最多有n(n -1)/2条边。
对于具有n 个顶点,e 条边的图,有e = ∑TD(v i )ni=112边的数目达到最大的图称为。
边的数目达到或接近最大的图称为,否则,称为。
完全图稠密图稀疏图DCEBAA, C, D, E (第2条路径)A, B, E (第1条路径)P(A, E):出发点与终止点相同的路径称为回路或环;顶点序列中顶点不重复出现的路径称为简单路径。
不带权的图的路径长度是指路径上所经过的边的数目,带权图的路径长度是指路径上经过的边上的权值之和。
子图3.对于图G=(V,E) 与G´=(V´,E´), 若有V´⊆V,E´⊆E,则称G´为G的一个子图。
G(1)无向图的连通4.图的连通连通分量——无向图中的极大连通子图。
v 9v 1v 2v 4v 3v 5v 6v 7v 1v 2v 4v 3v 1v 2v 4v 3v 5v 6v 9v 72个连通分量连通图非连通图无向图中顶点v i 到v j 有路径,则称顶点v i 与v j 是连通的。
若无向图中任意两个顶点都连通, 则称该无向图是连通的。
若有向图中顶点v i 到v j 有路径,并且顶点v j到v i 也有路径,则称顶点v i 与v j 是连通的。
若有向图中任意两个顶点都连通,则称该有向图是强连通的。
(强)连通图非连通图强连通分量——有向图中的极大强连通子图。
强连通分量(2)有向图的连通包含具有n个顶点的连通图G的全部n个顶点,仅包含其n-1条边的极小连通子图称为G的一个生成树。
5.生成树v1v2v3v4v1v2v3v4v1v2v3v4v1v2v3v4v1v2v3v4…v1v2v3v4GG的生成树1. 带自身环的图2. 多重图8.2图的存储方法1. 定义一个一维数组VERTEX[0..n -1]存放图中所有顶点的数据信息(若顶点信息为1,2,3,…,此数组可略)。
1当顶点v i 到顶点v j 有边时A[i][j]=0当顶点v i 到顶点v j 无边时{对于带权的图, 有w ij 当顶点v i 到v j 有边,且边的权为w ijA[i][j]=当顶点v i 到顶点v j 无边时{∞2. 定义一个二维数组A[0..n -1,0..n -1]存放图中所有顶点之间关系的信息(该数组被称为),有邻接矩阵0 1 1 11 0 1 11 1 0 11 1 1 0A 1 =∝4 ∝∝6 ∝7 ∝∝∝∝∝∝∝8∝A 2 =v 1v 2v 3v 4VERTEX1[0..3]0123v 1v 2v 3v 4VERTEX2[0..3]0123(1) 无向图的邻接矩阵一定是一个对称矩阵。
(2) 不带权的有向图的邻接矩阵一般是稀疏矩阵。
(3) 无向图的邻接矩阵的第i 行(或第i 列)非0 或非∝元素的个数为第i 个顶点的度数。
(4) 有向图的邻接矩阵的第i 行非0或非∝元素的个数为第i 个顶点的出度;第i 列非0或非∝元素的个数为第i 个顶点的入度。
v 1v4v 2v 30 1 1 11 0 1 11 1 0 11 1 1 0v 1v 2v 3v 4(无向图)0 1 0 01 0 1 00 0 0 00 0 1 0v 1v 2v 3v 4(有向图)特点其中,vertex 域存放某个顶点的数据信息;link 域存放某个链表中第一个结点的地址。
其中,next 域为指针域;weight 域为权值域(若图不带权,则无此域);adjvex 域存放以第i 个顶点为出发点的一条边的另一端点在头结点数组中的位置。
n 个头结点之间为一数组结构。
二.邻接表存储方法1. 每一个链表前面设置一个头结点,用来存放一个顶点的数据信息,称之为。
其构造为顶点结点建立n 个线性链表存储该图。
核心思想:2. 第i 个链表中的每一个链结点(称之为)表示以第i 个顶点为的一条边;边结点的构造为边结点出发点0 1 2 3v1v2v3v40123v 1v 2v 3v 46特点(((123123终止点第i个链表中的每一个链结点(称之为边结点)表示以第i个顶点为的一条边;出发点对于邻接表…三.有向图的十字链表存储方法( 略)四.无向图的多重邻接表存储方法( 略)以无向图为例8.3图的遍历从图中某个指定的顶点出发, 按照某一原则对图中所有顶点都访问一次, 得到一个由图中所有顶点组成的序列, 这一过程称为。
图的遍历出发点v 1v 2v 4v 7v 9v 5v 3v 6v 8012345678遍历序列列队采用邻接表存储该图:O(n+e)。
采用邻接矩阵存储该图:O(n2)。
一.什么是最小生成树v1v 2v3v48.4最小生成树v 1v 2v 3v 4…295带权连通图中,总的权值之和最小的带权生成树为。
最小生成树也称最小代价生成树,或最小花费生成树。
最小生成树二.求最小生成树依次在G 中选择一条一个顶点仅在V 中,另一个顶点在U 中,并且权值最小的边加入集合TE ,同时将该边仅在V 中的那个顶点加入集合U .重复上述过程n –1次,使得U=V ,此时T 为G 的最小生成树。
普里姆(Prim)方法克鲁斯卡尔(Kruskal)方法设G=(V, GE)为具有n 个顶点的带权连通图;T=(U, TE)为生成的最小生成树, 初始时,TE=空, U={v}, v∈V 。
普里姆(Prim )算法v 4v 2v 6v5v 3v 116115691814192220G :{ v 1, v 2, v 3, v 4, v 5, v 6 }V =(v 1, v 2)16,(v 1, v 3)20GE=(v 1, v 4)19 ,(v 2, v 3)11(v 2, v 5)6 ,(v 2, v 6)5(v 3, v 4)22 ,(v 3, v 5)14(v 4, v 5)18 ,(v 5, v 6)9T :U = { v 1}TE = { }(v 1, v 2)16,v 2(v 2, v 6)5,v 6(v 2, v 5)6,v 5(v 2, v 3)11,v 3,v 4(v 4, v 5)18克鲁斯卡尔(Kruskal )方法从G 中选择一条当前未选择过的、且边上的权值最小的边加入TE ,若加入TE 后使得T 未产生回路,则本次选择有效,如使得T 产生回路,则本次选择无效,放弃本次选择的边。
重复上述选择过程直到TE 中包含了G 的n -1条边,此时的T 为G 的最小生成树。
基本思想T=(U, TE)G=(V, GE)初始时,TE=空U=VG T (连通图)(生成树)v 4v 2v 6v 5v 3v 1569放弃111416放弃18克鲁斯卡尔(Kruskal)方法以1~n 分别代表n 个顶点,采用邻接矩阵存储该图,有W ij 当顶点v i 到顶点v j 有边,且权为W ijA[i][j]= ∞当顶点v i 到顶点v j 无边时0当v i =v j 时{设出发顶点为v (通常称为源点)。
1. 图的存储三.解决问题所需要确定的数据结构3. 设置数组dist[0..n -1] 分别记录源点v 到图中各顶点的最短路径的路径长度,其中,dist[i]记录源点到顶点i 的最短路径的长度。
初始时,dist 数组的值为邻接矩阵第v 行的n 个元素值。
(i =0,1, 2, …, n -1 )4. 设置数组path[0..n -1] 分别记录源点v 到图中各顶点的最短路径所经过的顶点序列,其中,path[i]记录源点到顶点i 的路径。
初始时,path[i]={v }, i =0,1, 2, …, n -1)2. 设置一个标志数组s[0..n -1]记录源点v 到图中哪些顶点的最短路径已经找到。
有:1表示源点到顶点i 的最短路径已经找到s[i] =0表示源点到顶点i 的最短路径尚未找到初始时,s[v]=1, s[i]=0 (i =0,1, 2, …, n -1 i ≠v ){1. 确定dist 、s 、path 三个数组的初值。
2.利用s 数组与dist 数组在那些尚未找到最短路径的顶点中确定一个与源点v 最近的顶点u ,并置s[u]为1,同时将顶点u 加入path[u]。
3. 根据顶点u 修改源点到所有尚未找到最短路径的顶点的路径长度。
即1) 将源点v 到顶点u 的(最短)路径长度分别加到源点v 通过顶点u 可以直接到达、且尚未找到最短路径那些的顶点的路径长度上。
若加后的长度小于原来v 到某顶点r 的路径长度,则用加后的长度替换原来的长度,否则,不作替换。
2)若替换,将源点v 到顶点u 的路径(最短路径)上经过的所有顶点替换path[r]。
4. 重复上述过程的第2至第3步n –1次。
s[i]=0;s[v]=1;path[i]={ v };四.算法(用自然语言表达)for(i=0;i<n;i++){dist[i]=A[v][i];}dist数组0 10 2 ∝∝∝∝s数组10 0 0 0 0 011111110 10 2 ∝∝∝∝10 0 ∝∝ 1 ∝∝2 ∝0 2 ∝11 ∝∝∝ 2 0 4 6 ∝∝ 1 ∝ 4 0 ∝7∝∝11 6 ∝0 3∝∝∝∝7 3 0邻接矩阵path数组132456710221147631最小代价生成树源点思考3 26251与源点有关相同不v 4v 2v 6v 5v3v 116115691814192220最小生成树结论•••一.什么是AOV 网一个建筑工程的施工流程…8.6 AOV 网与拓扑排序。