- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构_第3章_栈和队列
数据结构课程的内容 3.1 栈(stack) 栈的定义和特点 定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈。 特点:先进后出(FILO)或后进先出(LIFO) 例2:一个栈的输入序列是12345,若在入栈的过程中允许出栈,则栈的输出序列43512可能实现吗?12345的输出呢? 43512不可能实现,主要是其中的12顺序不能实现; 12345的输出可以实现,只需压入一个立即弹出一个即可。 例4:计算机系2001年考研题(程序设计基础) 设依次进入一个栈的元素序列为c,a,b,d,则可得到出栈的元素序列是: A)a,b,c,d B)c,d,a,b C)b,c,d,a D)a,c,d,b 二、栈的链式表示 Tower of Hanoi问题 问题描述:有A,B,C三个塔座,A上套有n个直径不同的圆盘,按直径从小到大叠放,形如宝塔,编号1,2,3……n。要求将n个圆盘从A移到C,叠放顺序不变,移动过程中遵循下列原则: 每次只能移一个圆盘 圆盘可在三个塔座上任意移动 任何时刻,每个塔座上不能将大盘压到小盘上 3.4 队 列 队列:一种先进先出的线性表 队头:允许删除的一端 队尾:允许插入的一端 关于队列,请同学们思考: 1、判断队列为空的条件是什么? 2、判断队列满的条件是什么? 3、如何将队列清空? 4、如何完成队列插入元素操作? 5、如何完成队列删除元素操作? 6、如何访问队列中的当前元素? 循环队列示意图 循环队列的头尾指针 循环队列判断满空条件: 队列判空条件:Q.rear==Q.front 队列判满条件: (Q.rear+1)% maxsize==Q.front 练习题 有5 个元素,其入栈次序为:A,B,C,D,E,在各种可能的出栈次序中,以元素C,D最先出栈(即C第一个且D第二个出栈)的次序有哪几个? 如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,而改置计数器count用以记录队列中结点的个数。 (1)编写实现队列的三个基本运算:判空、入队、出队。 (2)队列中能容纳元素的最多个数是多少? 答案: typedef struct {elemtp q[m]; int front,count; //front队首指针,count队列中元素个数 }cqnode; //定义类型标识符。 (1)判空:int Empty(cqnode cq) //cq是cqnode类型的变量 {if(cq.count==0) return(1);else return(0); //空队列} 入队: int EnQueue(cqnode cq,elemtp x) {if(cq.count==m){printf(“队满\n”);exit(0); } cq.q[(cq.front+count)%m]=x; //x入队 cq.count++; return(1); //队列中元素个数增加1,入队成功。 } 出队: int DelQueue(cqnode cq) {if (cq.count==0){printf(“队空\n”);return(0);} printf(“出队元素”,cq.q[cq.front]); x=cq.q[cq.front]; cq.front=(cq.front+1)%m; //计算新的队头指针。 cq.count--; return(x) } (2) 队列中能容纳的元素的个数为m。 设定当前位置的初值为入口位置; do{ 若当前位置可通, 则{将当前位置插入栈顶; 若该位置是出口位置,则算法结束; 否则切换当前位置的东邻方块为 新的当前位置; } 否则 { } }while (栈不空); 求迷宫中一条从入口到出口的路径的算法: … … 若栈不空且栈顶位置尚有其他方向未被探索, 则设定新的当前位置为: 沿顺时针方向旋转 找到的栈顶位置的下一相邻块; 若栈不空但栈顶位置的四周均不可通, 则{删去栈顶位置;// 从路径中删去该通道块 若栈不空,则重新测试新的栈顶位置, 直至找到一个可通的相邻块或出栈至栈空; } 若栈空,则表明迷宫没有通路。 例五:表达式求值 中缀表达式 a*b+c a+b*c a+(b*c+
文档评论(0)