刘勇3栈和队列.ppt

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
北京化工大学信息学院 数据结构 栈 ( Stack ) 八进制数、括号匹配、行编辑程序、迷宫、表达式求值、出栈合法性 队列 ( Queue ) 杨辉三角 栈的主要操作 队列 ( Queue ) 队列的主要操作 队列的链接表示 — 链式队列 * 定义 ●只允许在一端插入和删除的线性表; ●允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)。 特点 后进先出 (LIFO) 栈 ( Stack ) 退栈 进栈 a0 an-1 an-2 ? top bottom ADT Stack { //对象:由数据类型为StackData的元素构成 void push (StackData x); //进栈 void pop (); //出栈 StackData top (); //取栈顶 bool isEmpty (); //判栈空否 bool isFull (); //判栈满否(顺序栈) } top 空栈 top top top top top a 进栈 b 进栈 a a b a b c d e e 进栈 a b c d e f 进栈溢出 a b d e e 退栈 c top c 退栈 b 退栈 a b a a 退栈 空栈 top a b d d 退栈 c top a b c top top 栈的链接表示 — 链式栈 链式栈无栈满问题,空间可扩充 插入与删除仅在栈顶处执行 链式栈的栈顶在链头 适合于多栈操作 top 栈的应用举例 1— 八进制数 栈的应用举例 2— 括号匹配 {()()()()[][][]} 匹配 )))((( 不匹配 ({)} 不匹配 后出现的左括号先匹配 —— 栈 栈的应用举例 3— 行编辑程序 # 退格符 @ 退行符 switch(ch){ case '#': s.pop(); break; case '@': s.clear(); break; default: s.push(ch); break; } 栈的应用举例 4— 迷宫 到了一个位置,先往东走,走不通再顺时针换方向往南,西,北 栈的应用举例 4— 迷宫 求迷宫路径算法的基本思想是: 1、起点S入栈 2、反复执行以下步骤,直到栈为空,或者找到终点E (1)取栈顶m,标记m已被访问,根据m的方向找到下一个位置next; (2)如果next不是墙壁,也没有被访问过,将next入栈 (3)否则换方向继续找下一个位置 (4)4个方向都不能通过,出栈,回到第(1)步 3、找到终点E,迷宫走出 在找到终点E之前,栈空了,说明迷宫没有出去的路径 栈的应用举例 5— 表达式运算 栈的应用举例 5— 表达式运算 栈的应用举例 5— 表达式运算 操作数栈D,运算符栈O 1、操作数入栈D 2、遇到运算符OP1,和O栈顶运算符OP2比较: (1)如果OP2优先级高,则将两个栈的元素出栈,做运算,将运算结果入栈D; (2)如果OP1优先级高,OP1入栈O 栈的应用举例 6— 出栈合法性 算法: 1、辅助数组 bool isPushed[N+1] = {false},1入栈S, isPushed[1]=true 2、遍历出栈序列,对每个数字n,执行以下操作: (1)取S栈顶t,将t,t+1,t+2...n的所有不曾入栈的数字入栈,并在辅助数组中标记对应下标为true (2)取S栈顶t,若s=n,S出栈;若s!=n,则出栈序列非法。 已知自然数1,2,...,N(1<=N<=100)依次入栈,请问序列C1,C2,...,CN是否为合法的出栈序列。 如3 4 2 1 5是合法的 而3 5 1 4 2不是合法的 定义 队列是只允许在一端删除,在另一端插入的线性表 允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear)。 特性 先进先出(FIFO, First In First Out) a0 a1 a2 an-1 front rear ?? ADT Queue { //对象:由数据类型为QueueData的元素构成 void push (QueueData x); //进队 void pop(); //出队并取队头 QueueData front (); //取队头 bool isEmpty (); //判队空

文档评论(0)

gpcjc1996 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档