算法与数据结构:第三章 栈和队列_第1页
算法与数据结构:第三章 栈和队列_第2页
算法与数据结构:第三章 栈和队列_第3页
算法与数据结构:第三章 栈和队列_第4页
算法与数据结构:第三章 栈和队列_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 elemtype

2、* 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)都是由操作数(operand

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

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

5、nt 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、将第 n 个盘子从 A 柱移到 B 柱,3、再将 C 柱上面

6、的 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 Conquer,亦即“分而治之”的方法:把原问题分成若干个子问题,

7、对每一个子问题分别求解,然后把这些解连结成原问题的解。如果子问题仍然比较复杂,还可递归使用分治法,直到每个子问题都得出解为止,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 ?若有解则给出全部解,否则输出无解,作 业 4. 已知以字符型顺序表表示的表达式含有三种扩号“(”、“)”、“”、“”、“”

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

11、ueue,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; queue,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,判

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论