限定性线性表——栈和队列.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文档。上传文档
查看更多
限定性线性表——栈和队列

对假溢出的解决方案 队首固定,每次出队剩余元素向下移动——浪费时间 循环队列 基本思想:把队列设想成环形,让sq[0]接在sq[M-1]之后,若rear+1==M,则令rear=0; 解决方法:利用“模”运算 入队: rear=(rear+1)%M; sq.elem[sq.rear]=x; 出队: front=(front+1)%M; 如何判断队满、队空? 在循环队列中队列空、队列满时Q.front=Q.rear。要想辨别队列是空还是满有两个办法: 设一个标志位(以区别队列是“空”,是“满”); 设置一个标志: 初始化为 0, 当进行插入操作时 ,tag=1, 进行删除操作时tag=0. 对空: rear==front tag==0 队满: rear==front tag=1 少用一个元素空间(以尾指针加1等于头指针作为队列满标志),则 空时Q.front==Q.rear; 满时Q.front==(Q.rear+1)% Maxsize。 3) 带括号算术表达式 实现算符优先算法时需要使用两个工作栈:一个称作运算符栈operator;另一个称作操作数栈operand。 算法的基本过程如下: A.初始化操作数栈operand和运算符栈operator,并将表达式起始符“#”压入运算符栈; B.读入表达式中的每个字符,若是操作数则直接进入操作数栈operand,若是运算符,则与运算符栈operator的栈顶运算符进行优先权比较,并做如下处理: 返回主目录 ?? (1) 若栈顶运算符的优先级低于刚读入的运算符,则让刚读入的运算符进operator栈; (2) 若栈顶运算符的优先级高于刚读入的运算符,则将栈顶运算符退栈,送入θ,同时将操作数栈operand退栈两次,得到两个操作数a、b,对a、b进行θ运算后,将运算结果作为中间结果推入operand栈; (3) 若栈顶运算符的优先级与刚读入的运算符的优先级相同,说明左右括号相遇,只需将栈顶运算符(左括号)退栈即可。 当operator栈的栈顶元素和当前读入的字符均为“#”时,说明表达式起始符“#”与表达式结束符“#”相遇,整个表达式求值完毕。 返回主目录 3.1.4 栈与递归的实现 递归 :在定义自身的同时又出现了对自身的调用。 直接递归函数:如果一个函数在其定义体内直接调用自己,则称直接递归函数。 间接递归函数:如果一个函数经过一系列的中间调用语句,通过其它函数间接调用自己,则称间接递归函数。 返回主目录 3.2 队列 3.2.1 队列的定义 3.2.2 链队列 3.2.3 队列的顺序存储结构 返回主目录 在表的一端进行插入,而在另一端进行删除的线性表。 队尾:进行插入的一端。 队首:进行删除的一端。 a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 进队 出队 队首 队尾 3.2.1 队列的定义 · 链接表示的队列:参照下图所示。其中 Q.front 和 Q.rear 分别是队首和队尾指针。它们指示着真正的队首的前一结点和真正的队尾结点。 typedef struct Qnode { QElemType data; struct Qnode * next; } Qnode, * QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; } LinkQueue; · 链接队列的操作: data next 队首结点 ∧ Q.front 队尾结点 Q.rear 3.2.2 链队列 · 链接队列的操作: data next Q.front Q.rear ∧ data next Q.front 队尾结点(队首结点) Q.rear ∧ 队首结点 ∧ data next Q.front 队尾结点 Q.rear 队列的初始化: 返回主目录 InitQueu(LinkQueue *Q) { Q.front=Q.rear=(Queueptr)malloc(sizeof(Qnode)); if(Q.front==NULL) {printf(“overflow”); exit;} Q.front-next=NULL; } 队列的插入: 返回主目录 InitQueu(LinkQueue *Q, Qelemtype x) { p=(Queueptr)malloc(sizeof(Qnode)); if(p==NULL) {printf(“ove

文档评论(0)

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

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

1亿VIP精品文档

相关文档