[农学]第三章 栈与队列.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[农学]第三章 栈与队列

数据结构 第三章 栈与队列 徐家臻 xjzccnu@ QQ本章主要内容 栈的概念 栈的不同表示方法 顺序表 链表 不同表示方法的区别:顺序表与链表的区别 栈的定义与基本操作 定义(顺序表) typedef struct { ElemType* elems; int size; int len; } Stack; 操作 初始化 init(Stack* s) 销毁 destroy(Stack* s) 栈是否为空 isEmpty(Stack* s) 进栈 push(Stack* s, ElemType e) 出栈 ElemType* pop(Stack* s, ElemType* e) 获取栈顶元素 ElemType* top(Stack* s, ElemType* e) 判断栈为空、进栈操作 出栈、获取栈底元素操作 函数的嵌套调用与栈的关系 递归 递归函数 —— 直接或间接调用自己的函数 示例: 阶乘函数: 斐波那契数列: 阶乘函数实现 int fact(int n) { if (n == 0) return 1; else return n * fact(n - 1); } void main() { printf(%d! = %d\n, 5, fact(5)); } 斐波那契数列实现 int fib(int n) { if (n == 0) return 0; if (n == 1) return 1; else return fib(n - 1) + fib(n - 2); } void main() { printf(fib number: \n); for (int i = 0; i 10; i++) { printf(%d , fib(i)); } printf(\n); } 递归的效率 汉诺塔问题 汉诺塔问题是由很多个放置在三个塔座上的盘子组成的古老难题 所有盘子直径不同,并且盘子中央都有一个洞以便它们能够放在塔座上,开始时所有盘子都放在A塔座,目标是将所有盘子都放到C塔座。 限制:每次只能移动 一个盘子,并且任何盘 子都只能放在比自己大 的盘子上 分治法 把待求解问题分解为更小的问题,然后对小问题加以解决 汉诺塔的递归解决方法 分3步: 把前n-1个盘子移到中间的塔座B 把最后一个盘子移到塔座C 把中间塔座B上的n-1个盘子移动塔座C 方法可行吗? 汉诺塔的递归实现 void move(int i, char src, char des) { printf(plate %d: %c - %c\n, i, src, des); } void hanoi(int n, char a, char b, char c) { if (n == 1) { move(1, a, c); } else { hanoi(n - 1, a, c, b); move(n, a, c); hanoi(n - 1, b, a, c); } } void main() { hanoi(3, a, b, c); } 分治法举例——归并排序 假设初始序列含有n个记录,可看成是n个有序子序列,每个子序列长度为1,对其两两归并,得到n/2个长度为2的有序子序列;然后再两两归并,如此往复,直到得到长度为n的有序序列为止。 如何使用分治法? merge 归并排序的时间复杂度 递归树 练习——八皇后问题 八皇后问题是十九世纪著名的数学家高斯提出的:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻(任意两个皇后都不能处于同一行、同一列或同一斜线上),问有多少种摆法。 回溯法 寻找问题的解的一种可靠的方法是首先列出所有候选解,然后依次检查每一个,在检查完所有或部分候选解后,即可找到所需要的解。 回溯法是搜索算法中的一种控制策略,但与穷举法不同的是,它是从初始状态出发,运用题目给出的条件、规则,按照深度优先搜索的顺序扩展所有可能情况 迷宫求解 迷宫求解 迷宫求解树 队列的概念 队列的定义与操作 定义(顺序表) typedef struct { ElemType* elems; int front; int rear; } Queue; 也可以使用链表实现 操作 初始化 销毁 队列是否为空 进队 出队 获取队列头元素 双端队列(Deque) 限定插入和删除操作在表的两端进行的线性表 可以用作队列或堆栈 队列空间利用问题 假设队列共有6个存储单元。 经过从(a)到(d)的进队-出队过程后,队列已经没有存储单元可用了。 循环队列 循环队列 将顺序队列臆造为一个环形队列 循环队列 如何实现循环队列? 判断队列满 fro

文档评论(0)

qiwqpu54 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档