- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三章 栈和队列 栈 ( Stack ) 栈的应用 递归 队列 ( Queue ) 3.1 栈 ( Stack ) 1)栈的定义 限定在表尾进行插入和删除操作的线性表 允许插入和删除 的一端称为栈顶 (top),另一端称 为栈底(bottom) 特点 后进先出 (LIFO) 2) 栈的抽象数据类型 3.1.1 栈的顺序存储 — 顺序栈 3) 基本操作的实现 ②出栈(退栈) 顺序栈演示: 多栈处理 栈浮动技术 n 个栈共享一个数组空间V[m] 设立栈顶指针数组 t [n+1] 和栈底指针数组 b [n+1],t[i]和b[i]分别指示第 i 个栈的栈顶与栈底 各栈初始分配空间 s = ?m / n? 指针初始值 t[0] = b[0] = -1 b[n] = m-1 t[i] = b[i] = b[i-1] + s, i = 1, 2, …, n-1 3.1.2 栈的链式存储 — 链式栈 1)存储特点 是一种特殊形式的单链表(无表头结点;插入、删除操作限定在表头端进行) 链式栈无栈满问题,空间可扩充 2)链式栈的表示:同单链表 typedef struct node { SElemtype data; struct node *next; } linkstack; 3)基本运算的实现 ② 出栈(退栈) 3.1.3 栈的应用举例 例1:简单应用:数制转换问题 问题:将十进制数N转换为r进制的数,其转换方法利用辗转相除法。 分析:所转换的r 进制数按低位到高位的顺序产生,而通常的输出是从高位到低位的,恰好与计算过程相反 例2 中缀表达式求值 问题:根据算符优先法对表达式求值,所讨论的算术运算符包括:+ 、- 、*、/、%、^(乘方)和括号()。运算规则为: 运算符的优先级为: ()→ ^ →*、/、% → +、-; 有括号时先算括号内的,后算括号外的,多层括号由内向外进行; 乘方连续出现时先算最右面的; 分析:表达式作为一个串,如表达式“3+2*4-5”,其求值过程为:自左向右扫描表达式,当扫描到3*2时不能马上计算,因后面可能有更高的运算 需要两个栈:对象栈OPND和算符栈OPTR; 自左至右扫描表达式, 若当前字符是运算对象,入OPND栈; 对运算符,若这个运算符比栈顶运算符高则入栈,继续向后处理,若这个运算符比栈顶运算符低则从OPND栈出栈两个数,从OPTR栈出栈一运算符进行运算,并将其运算结果入OPND栈,继续处理当前字符,直到遇到结束符。 例3 栈与递归 问题:栈的一个重要应用是在程序设计语言中实现递归过程。 n! = 分析:根据定义可以很自然的写出相应的递归函数 int fact (int n) { if (n==0) return 1; else return ( n*fact(n-1)); } 递归的概念 递归的定义 若一个对象部分地包含它自己, 或用它自己给自己定义, 则称这个对象是递归的;若一个过程直接地或间接地调用自己, 则称这个过程是递归的过程。 以下三种情况常常用到递归方法。 定义是递归的 数据结构是递归的 问题的解法是递归的 定义是递归的 递归过程与递归工作栈 递归过程在实现时,需要自己调用自己。 每一次递归调用时,需要为过程中使用的参数、局部变量等另外分配存储空间。 层层向下递归,退出时的次序正好相反: 递归次序 n! (n-1)! (n-2)! 1! 0!=1 返回次序 因此,每层递归调用需分配的空间形成递归工作记录,按后进先出的栈组织。 3.2 队列 (Queue) 1) 定义 队列是只允许在一端删除,在另一端插入的线性表 允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear)。 特性 先进先出(FIFO, First In First Out) 2)队列的抽象数据类型 3.2.1 队列的链接存储—链式队列 1) 存储特点: 队头在链头,队尾在链尾。 设置队头、队尾指针分别保存队头、队尾地址 2) 链队列表示: 结点类型: typedef struct Qnode { QElemtype data; struct QNode *next;
原创力文档


文档评论(0)