ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:22.63KB ,
资源ID:7886530      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7886530.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(完整数据结构详细教案栈和队列.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

完整数据结构详细教案栈和队列.docx

1、完整数据结构详细教案栈和队列(完整)数据结构详细教案栈和队列 编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)数据结构详细教案栈和队列)的内容能够给您的工作和学习带来便利。同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快 业绩进步,以下为(完整)数据结构详细教案栈和队列的全部内容。数据结构教案第三章 栈和队列第3章 栈和队列3.1 栈的基本概念3.1.1 栈的抽象数据类

2、型定义1、栈的逻辑特征1)限定在表尾进行插入或删除操作的线性表;2)栈顶-表尾端;栈底-表头端3)后进先出的线性表2、抽象数据类型的定义ADT Stack数据对象:D=ai aiElemSet, i=1,2,,n, n0数据关系:R=R1,R1=ai-1,ai|ai-1,aiD, i=2,3,n 基本操作:InitStack( &S )操作结果:构造一个空的栈SDestroyStack( S )初始条件:栈S已存在操作结果:销毁栈SClearStack( &S )初始条件:栈S已存在操作结果:将栈S重置为空栈StackEmpty( S )初始条件:栈S已存在操作结果:若S为空栈,则返回TRUE

3、,否则返回FALSEStackLength( S )初始条件:栈S已存在操作结果:返回栈S中数据元素的个数GetTop( S, &e )初始条件:栈S已存在且非空操作结果:用e返回S中栈顶元素Push( &S, e )初始条件:栈S已存在操作结果:插入元素e为新的栈顶元素Pop( &S, &e )初始条件:栈S已存在且非空操作结果:删除S的栈顶元素,并用e返回其值StackTraverse( S, visit( ) )初始条件:栈S已存在且非空操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit( ).一旦visit( )失败,则操作失败ADT Stack思考:栈的取元素、插入、删除

4、操作与线性表的相应操作有何区别,为什么?3.1.2 顺序栈1、增量式顺序栈的定义define STACK_INIT_SIZE 100 / 存储空间的初始分配量 /define STACKINCREMENT 10 /* 存储空间的分配增量 */typedef structElemType base; /* 栈底指针 /ElemType *top; /* 栈顶指针(栈顶元素的下一个位置) /int stacksize; /* 当前分配的存储容量 */SqStack;1)和顺序表一样采用增量式的空间分配;2)操作和栈顶相关:插入操作(入栈):将待插元素插入到栈顶元素的下一个位置;删除操作(出栈):删

5、除栈顶元素;取元素操作:取栈顶元素的值.各操作的操作位置与栈顶元素的位置或其下一个位置相关,希望在O(1)时间内能获取操作位置,故可设置专门的栈顶指针top.3)约定:top指向栈顶元素的下一个位置(便于表示空栈)。4)栈顶的初始化:S。top = S.base(在上述3)约定下的空栈形式),5)栈空:S.base = S.top,栈满:S。top - S.base = S.stacksize6)入栈:*S。top + = e,出栈:e = *-S。top注意:4), 5), 6)步受3)制约。约定不同,相应的判定和处理也不一样.如假设top就指向栈顶元素,此时4),5),6)如何?2、取栈顶

6、元素GetTop_Sq1)算法设计参数:顺序栈S、取得的栈顶元素e分析:由于top指向栈顶元素的下一个位置,因此实际的栈顶元素的位置应是top -1;栈非空时,此操作有效.算法1Status GetTop_Sq(SqStack S, ElemType &e)/ 判断栈是否为空 /if ( S。base = S.top) return ERROR;e = ( S.top -1);return OK;3、入栈操作Push_Sq1)算法设计参数:顺序栈S、插入元素e分析:插入位置为栈顶元素的下一个,无须判断位置的合法性;上溢即栈满的条件需要判断,由于是增量式分配,故栈满时需要重新申请空间; 算法2S

7、tatus Push_Sq( SqStack &S, ElemType e )/* 判断栈是否为满 */if ( S.top S。base = S.stacksize )/* 栈满,追加空间 /S.base = ( ElemType * ) realloc( S.base, ( S。stacksize + STACKINCREMENT ) * sizeof(ElemType) );if ( S。base = NULL ) exit(OVERFLOW); S.top = S。base + S.stacksize; S.stacksize += STACKINCREMENT;S。top+ = e;

8、return OK; 2)算法分析-时间T(n) = O(1)4、出栈操作Pop_Sq1)算法设计参数:顺序栈&S、删除的栈顶元素&e分析:在栈非空时,删除栈顶元素算法3Status Pop_Sq( SqStack S, ElemType e)/* 判断栈是否为空 */if (S.base = S。top) return ERROR;e = *( -S。top); / 注意与GetTop( )的区别 /return OK; 2)算法分析时间T(n) = O(1)3.1.3 链栈与链表类似,只是链表的头指针即为栈顶指针.因其操作均在栈顶进行,故可以不引入头结点。思考:在链栈下的入栈、出栈以及取栈

9、顶元素的操作的算法如何写?3.2 栈的应用3.2.1 数制转换:将十进制数N转换成其他d进制数算法思想:N = ( N div d )d + N mod d1)将N%d的结果保存,2)N=N/d,3)若N=0结束,否则继续1)。保存的余数从先到后依次表示转换后的d 进制数的低位到高位,而输出是由高位到低位的,因此必须定义先进后出的线性表栈来保存;当全部的余数求出后,通过逐个出栈输出d进制数.3.2.2 括号匹配的检验算法思想:从左至右扫描表达式,遇左括号入栈,遇右括号与栈顶元素比较:若左右括号匹配,则继续扫描;否则说明不匹配,结束。在上述操作中,若栈为空,或扫描结束后栈不为空,均说明不匹配。3

10、.2.3 行输入处理程序处理规则:遇退一格;遇退一行算法思想:引入栈,保存终端输入的一行字符(逐行处理);遇退一格-出栈一次遇退一行清栈步骤: 1)初始化栈S2)读入字符ch3)ch!=EOF3。1) ch!=EOF ch!=n3。1。1)ch为:Pop(S, c), 转3.1.4)3.1。2)ch为: ClearStack (S) , 转3。1.4)3.1.3)ch为其他: Push (S, ch) , 转3.1.4)3。1。4)再读入字符ch,继续3。1)3。2) 处理完一行,清空栈3.3) 如ch!=EOF,读入字符ch,继续3) 3.2.4 迷宫求解问题:找从“入口到“出口的路径(所经

11、过的通道方块)分析:1)方块的表示-坐标,当前的状态(障碍、未走的通路、已走的通路);2)已走的路径:A.路径中各方块的位置及在路径中的序号;B.从各方块出发已探索的方向,注意不能重复(可约定按东、南、西、北的方向顺次探索);C.从当前方块无路可走时,将已走路径回退一个方块,继续探索其他未走的方向栈-存储已走的通道块3.2.5 表达式求值1、问题描述只包含+, -, , / 四个双目运算符,且算符本身不具有二义性;三个运算规则运算符优先关系(考虑算符本身的优先级和结合性);只有 (=),=;假设输入的是一个合法的表达式。2、算法思想引入OPTR和OPND两个栈初始:OPTR有一个元素,OPND

12、为空读入一字符cc=#:return(GetTop(OPND))c非运算符:Push(OPND,c)c运算符:t=GetTop(OPTR),比较t和c的优先关系 tc:Pop(OPTR, theta); Pop(OPND, b); Pop(OPND, a); x=Operate(a, theta, b); Push(OPND, x);继续读入字符处理。 3.3 栈与递归的实现1、递归定义直接或间接地调用自身的函数,称为递归函数。如右图所示,递归表现为:在该函数的所有可能执行路径中,存在一条由于调用自身或其它函数所导致的环路路径;为确保函数最终在有限的时间内执行完毕,必须在环路中存在一个出口,即

13、当某种条件成立时,不必执行环路,而直接执行一条通向结束的非环路线.2、递归应用1)递归应用类型递归定义的数学问题具有递归特性的数据结构,其操作可以递归地表示其它一些问题2)递归应用的特点对于一个问题,当问题规模很大时,往往难于直接求解,此时:将大问题分解成若干小问题考虑如何利用这些小问题的解构成大问题的解避免陷入考虑如何求解小问题这种分解、合成的方法就是递归求解中的递归方法;另外,递归应用要注意避免陷入死循环,递归必须有出口,即要确立递归的结束条件,给出此时的直接求解方法.3)递归应用举例Hanoi塔问题3、递归的实现1)系统的处理(1)调用前现场保护,被调用函数的局部变量的空间分配,控制转移

14、至被调用的函数入口.(2)调用后保存计算结果,释放被调函数的数据区,控制转移回调用处。2)实现-栈“后调用先返回”。系统利用递归工作栈记录各层调用的现场信息。3.4 队列的基本概念3.4.1 队列的抽象数据类型定义1、队列的逻辑特征1) 先进先出的线性表2) 队头:允许删除的一端;队尾:允许插入的一端3) 应用举例:操作系统的作业排队2、队列的抽象数据类型定义 ADT QueueADT Queue数据对象:D=ai |aiElemSet, i=1,2,,n, n0数据关系:R=R1,R1=ai-1,ai|ai-1,aiD, i=2,3,n 基本操作:InitQueue(&Q)操作结果:构造一个

15、空队列QDestroyQueue(&Q)初始条件:队列Q已存在操作结果:销毁队列QClearQueue(&Q)初始条件:队列Q已存在操作结果:将队列Q重置为空队列QueueEmpty(Q)初始条件:队列Q已存在操作结果:若Q为空队列,则返回TRUE,否则返回FALSEQueueLength(Q)初始条件:队列Q已存在操作结果:返回队列Q中数据元素的个数GetHead(Q,e)初始条件:队列Q已存在且非空操作结果:用e返回Q中队头元素EnQueue(&Q, e)初始条件:队列Q已存在操作结果:插入元素e为Q的新的队尾元素DeQueue(&Q, &e)初始条件:队列Q已存在且非空操作结果:删除Q的

16、队头元素,并用e返回其值QueueTraverse(Q, visit())初始条件:队列Q已存在且非空操作结果:从队头到队尾依次对Q的每个数据元素调用函数visit()。一旦visit()失败,则操作失败ADT Queue3、双端队列1) 限定插入和删除在表的两端进行,应用举例:铁道转轨网络2) 输出受限的双端队列和输入受限的双端队列3) 双端队列两个栈底相邻接的栈:限定双端队列,从某端点插入的元素只能从该端点删除。3.4.2 链队列1、链队列的定义typedef struct QNodeElemType data;struct QNode next;QNode, *QueuePtr;type

17、def struct QueuePtr front; /* 队头指针,指向头元素 /QueuePtr rear; / 队尾指针,指向队尾元素 /LinkQueue;1)引入队头指针、队尾指针:在O(1)时间内找到操作结点2)引入头结点:队尾插入时,使队空和队不空的结点表示一致3)队空的判断:头、尾指针均指向头结点4)队满的判断转变成对申请空间是否成功的判断。2、类型说明操作实现:初始化、入队、出队注意:队空的判断、入队、出队依赖于队列的表示及其约定。进一步考虑: 若无头结点,此时队列的初始化、入队、队空的条件、出队等如何表示与实现?3.4.3 循环队列1、循环队列的定义采用顺序表存储,约定fr

18、ont指向队列头元素,rear 指向队尾元素的下一位置。define MAXQSIZE 100 /* 最大队列长度 /typedef structElemType *base; / 存储空间 /int front; / 头指针,指向队列的头元素 /int rear; / 尾指针,指向队尾元素的下一个位置 /SqQueue; / 非增量式的空间分配 /2、操作实现1)空队:Q。front=Q.rear=0;2)入队:判断是否队满,非队满时,Q。rear位置放新插入的元素,Q.rear+3)出队:判断是否队空,非队空时,Q.front位置为待删除的元素,Q.front+4)队空条件:Q.front

19、 = Q.rear5)队满条件:Q.rear = MAXQSIZE1问题:存在假上溢(由于出队操作,队列空间的上部可能存在空闲空间)3、假上溢的解决将队列假想为首尾相接的环,即循环队列。1)入队:,Q.rear = ( Q.rear+1)%MAXQSIZE2)出队:,Q。front = ( Q.front+1)%MAXQSIZE3)队空条件:Q。front = Q。rear,由于出队Q。front追上了Q.rear4)队满条件:Q.front = Q。rear,由于入队Q。rear追上了Q.front问题:队空和队满的判断条件一样4、如何区分队空和队满1)设标志位:不足在于需要额外对标志位的判断及维护2)在队列的结构中引入长度成员,在初始化队列、入队、出队操作中维护这个成员。3)少用一个元素空间,即队满的条件如下(Q。rear+1)% MAXQSIZE = Q。front进一步思考:1)对比4中所列的3种方法在队列操作中处理的不同。2)若循环队列数组的下标起始为3, 1或3时,如何判断队空、队满,如何实现入队、出队?3.5 队列与栈的应用3.5.1 离散事件模拟

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1