算法与数据结构幻灯片-dsc3

上传人:F****n 文档编号:88172833 上传时间:2019-04-20 格式:PPT 页数:26 大小:344KB
返回 下载 相关 举报
算法与数据结构幻灯片-dsc3_第1页
第1页 / 共26页
算法与数据结构幻灯片-dsc3_第2页
第2页 / 共26页
算法与数据结构幻灯片-dsc3_第3页
第3页 / 共26页
算法与数据结构幻灯片-dsc3_第4页
第4页 / 共26页
算法与数据结构幻灯片-dsc3_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《算法与数据结构幻灯片-dsc3》由会员分享,可在线阅读,更多相关《算法与数据结构幻灯片-dsc3(26页珍藏版)》请在金锄头文库上搜索。

1、3.1 栈,第三章. 栈和队列 (Chapter 3. Stack and Queue),栈(stack)是插入和删除操作受限的线性表,是一种后进先出(Last In First Out - LIFO)的线性表。表头端称为栈底(bottom),表尾端称为栈顶(top),插入和删除都在栈顶进行。,bottom,top,栈的基本操作:,Inistack,Clear,Gettop,Empty,Push,Pop,栈的实现:,#define STACK_INIT_SIZE user_supply #define STACKINCREMENT user_supply typedef struct elem

2、type * bottom ; elemtype * top ; int stackzise ; sqstack ;,顺序存储结构表示栈,Full,typedef strcut lnode elemtype data ; struct lnode * next ; * linkedstack;,链式存储结构表示栈-链栈(Linked_stack),上溢(overflow):若栈的容量已全部用完,再进行插入操作(PUSH),就会发生上溢错误。,下溢(underflow):若栈已空,再进行删除操作(POP),就会发生下溢错误。,3.2 栈的应用-表达式求值,任一表达式(expression)都是由

3、操作数(operand)、操作符(operator)和界限符(delimiter)组成。,我们通常习惯使用中缀表达式(infix expression),但中缀表达式离不开括号(bracket)。若使用前缀表达式(prefix expression)或后缀表达式( postfix expression)则不需要括号。利用栈,可以将中缀表达式变为前缀表达式或后缀表达式,再用栈进行运算即可得到表达式的值(value)。,3.3 栈与递归,递归(recursive):一个程序直接调用自己或通过其它程序调用自己就称为递归。根据调用关系可分为直接递归(direct recursive)和间接递归(ind

4、irect recursive )。,第 一 次 上 机 作 业 输入表达式字符串,以“=”表示结束, 计算并输出表达式值。 操作数可以是整数或实数,操作符有 “+”、“-”、“*”、“/”、“”(乘方)和 “sin( )”(正弦)、“cos( )”(余弦)、“log( )”(对数)、“ln( )”(自然对数)等函数。,栈在程序的过程或函数调用中的作用:,过程一,过程二,过程三,过程四,断点一,断点二,断点三,stack,递归是程序设计中一种强有力的工具。下面三种情况可用递归解决:,1、有些数学函数是递归定义的,对其求解可用递归;,2、有些数据结构具有递归特性,对其操作可用递归;,3、有些问题

5、的解决方法用递归描述,对其求解也可用递归。,int Fact ( int n ) if ( ! n ) return 1 ; / 出口条件 return n * Fact ( n 1 ) ; / 递归调用部分 ,int Min ( sqlist S, int n ) if ( n=1 ) return S 1 ; / 出口条件 x = Min ( S, n-1 ); if ( x S n ) return x; else return S n ; / 递归调用部分 ,如何解决这个问题呢?真伤脑筋啊!,解决该问题可分三步走:,1、将 A 柱上面的 n-1 个盘子从 A 柱移到 C 柱;,2、将第

6、 n 个盘子从 A 柱移到 B 柱;,3、再将 C 柱上面的 n-1 个盘子移到 B 柱。,void Hanoi ( int n , int x, int y, int z) If ( n ) / 出口条件 Hanoi ( n 1 , x, z, y ) ; / 递归调用部分 Move ( n, x, y ) ; Hanoi ( n - 1, z, y, x); ,求费波拉契数列(Fibonacci)、迷宫问题(Maze)、八皇后(Eight Queens)、骑士遍历(Cavalier travel)等等。,以下这些问题也可用递归程序解决:,程序设计常用方法之一:分治法(Divide and

7、Conquer),亦即“分而治之”的方法:把原问题分成若干个子问题,对每一个子问题分别求解,然后把这些解连结成原问题的解。如果子问题仍然比较复杂,还可递归使用分治法,直到每个子问题都得出解为止。,2、下面求 S 中 n 个元素最大值的方法也是使用的分治法:,int Max ( int S MAXLEN , int n) if ( n = 1 ) return S 0 ; m = Max ( S , n 1 ) ; if ( m S n ) return m ; return S n ; ,程序设计常用方法之二: 回溯法(Backtracking),回溯法是一种满足一定条件的穷举搜索法:在求解过

8、程中,不断利用可供选择的规则扩展部分解,一旦当前的部分解不成立,就停止扩展,退回到上一个较小的部分解继续试探,直到找到问题所有的解或无解为止。,void MapColor ( int R n n , int s n ) s 0 =1; / 00 区染 1 色 i = 1 ; j = 1 ; / i 为区域号,j 为染色号 while ( i n ) while ( j 4 ) / 该区染色成功,结果进栈,继续染色下一区, if ( j 4 ) j = s - - i + 1; ; / (回溯)变更栈顶区域的染色色数,用新颜色重试 ,s:,2、过河问题:某人带了一条狗、一只鸡和一筐菜过河,因船小

9、,每次只能带一样东西过河。若单独留下狗和鸡,则狗会吃鸡;若单独留下鸡和菜,则鸡会吃菜。试问他如何过河?,结果如下: 1、人+鸡过河; 2、人空手返回; 3、人+狗过河; 4、人+鸡返回; 5、人+菜过河; 6、人空手返回; 7、人+鸡过河。,前面说到的迷宫问题、八皇后问题、骑士遍历问题均可应用回溯法求解。,作 业 2. 试推导求解 n 阶梵塔问题至少要执 行的移动操作 move 次数。 3. 一个简化的背包问题:一个背包能装总重量为 T,现有 n 个物件,其重量分别为(W1、W2、Wn)。问能否从这 n 个物件中挑选若干个物件放入背包中,使其总重量正好为 T ?若有解则给出全部解,否则输出无解

10、。,作 业 4. 已知以字符型顺序表表示的表达式含有三种扩号“(”、“)”、“”、“”、“”和“”,它们可嵌套使用,试写出算法判断给定表达式中所含扩号是否正确配对出现。,第 二 次 上 机 作 业 八皇后问题或骑士遍历问题任选一个。,递归过程的模拟,对有些具有尾递归的过程,由于尾递归后不需保留参数和局部变量,可直接用循环代替递归。例如:,3.3 队列,队列(queue)也是插入和删除操作受限的线性表,但是一种先进先出( First In First Out - FIFO)的线性表。表头端称为队头(front),表尾端称为队尾(rear),插入在队尾进行,而删除则在队头进行。,front,rea

11、r,队列的基本操作:,Iniqueue,Clear,Gethead,Empty,Enqueue,Dequeue,Full,Size,队列的实现:,链式存储结构表示队列,typedef struct node elemtype data ; struct node * next ; * pointer; typedef struct pointer front, rear ; linkedqueue ;,顺序存储结构表示队列,#define MAXLEN user_supply typedef struct elemtype elem MAXLEN ; int front , rear; que

12、ue;,ENQUEUE1,ENQUEUE2,ENQUEUE3,DEQUEUE1,ENQUEUE4,DEQUEUE2,ENQUEUE5,ENQUEUE6,ENQUEUE7,ENQUEUE8,ENQUEUE1,ENQUEUE2,ENQUEUE3,DEQUEUE1,ENQUEUE4,DEQUEUE2,ENQUEUE5,ENQUEUE6,ENQUEUE7,ENQUEUE8,q1,q2,q3,q4,q5,q6,q7,q8,循环队列 (circular queue),i = (i+1) % n 入队列 rear+1,出队列 front+1, 元素个数 =(rear front + n ) % n,F,R,F,R,F,R,R,R,R,R,R,R,判断循环队列满和空的三种方法:,2、留下一个单元不使用,则 rear 永远也追不上 front;,作 业 5. 若栈的输入序列为 1234,给出所有可能的输出序列。 6. 已知有两个栈 S1 和 S2 及其基本操作 Push(S , x)、Pop(S)、Full(S) 和 Empty(S),给出用此二栈实现队列操作Enqueue、Dequeue、Fullq 和Emptyq的算法,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号