- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3 栈和队列 数据结构 3 栈和队列 主要内容 栈的类型定义 栈的表示 顺序表示 链表表示 栈的应用 进制转换 括号匹配 地图四染色问题 走迷宫 表达式计算 栈和递归 栈的类型定义 初始化:栈内没有元素 栈的应用 栈的应用 颠倒元素顺序 直接应用栈先进后出的特性 数制转换 记录“历史信息” 括号匹配的检验 地图四染色问题 走迷宫 表达式计算 栈的应用:括号匹配检测 问题 括号、引号等符号是成对出现的,必须相互匹配 设计一算法,自动检测输入的字符串中的括号是否匹配 比如: {}[([][])]匹配 [(]),(()]都不匹配 括号的匹配规则 从里向外开始 左括号应当和最近的右括号匹配 [ ( [ ] [ ] ) ] 栈的应用:括号匹配检测 发现规律 当扫描到当前字符的时候,需要知道已经扫描过的字符中,哪一个离它最近 因此希望有一个工具,能够记录扫描的历史,这样可以方便的得到最近的上一次访问的字符 栈的应用:括号匹配检测 栈“记录历史”的特性 人的记忆: 越早发生的事情越难回忆 越迟发生的事情越容易回忆 栈的先进后出 越早压入的元素越晚弹出 越迟压入的元素越早弹出 因此很自然的想到利用栈来模拟记忆 栈的应用:走迷宫 问题 如果你是在一点也不了解迷宫结构的情况下去走迷宫的话,显然只能是摸索着前进,比如先往一个方向走,若走不通那就只能退回来再试试另一个方向 但在走的过程中,我们一定会有意识地“记住” 已经走过的路,否则会被困在迷宫中永远也走不出来了,对吗? 栈的应用:走迷宫 分析 进入迷宫后,依次试探四个方向,如走得通就顺着当前试探的方向往前走,如走不通,就换个方向进行试探,直到出口 若某个位置上四个方向都走不通的话,就退回到前一个位置,换一个方向再试;若这个位置(前一个位置)已经没有方向可试了,就再退一步; 如果所有已经走过的位置的四个方向都试探过了,一直退到起始点都没有走通,说明迷宫根本不通 所谓“走不通”不单是指遇到墙挡路,还有“已经走过的路不能重复走第二次” 栈的应用:走迷宫 再次应用栈来记录历史 显然为保证在任何位置上都能沿原路退回,需要用一个“后进先出”的结构即栈来保存从入口到当前位置的路径 在走出出口之后,栈中保存的正是一条从入口到出口的路径 栈的应用:走迷宫 算法思想 若当前位置“可通”,则纳入“当前路径”(入栈),并继续朝下一位置探索 若当前位置“不可通”,则应顺着“来的方向”退回到“前一位置”(取栈顶元素),然后朝着除“来向”之外的其它方向继续探索 若该通道块的四周四个方块均“不可通”,则应从“当前路径”上删除该通道块(退栈) 算法 while(栈不空还没到达出口) { 增加试探的方向个数 if(栈顶位置的四周均不通) { 弹出栈顶 } else //栈顶位置还有其它方向未探索 { 走向栈顶位置的顺时针下一位置 if当前位置可通 { 当前位置入栈 if当前是出口,结束 }//if }//else }//while 栈的应用:表达式求值 基本概念 双目运算符:需要两个运算数,比如+、- 单目运算符:需要一个运算数,比如++、-- 我们暂时只考虑双目运算符 运算符的优先级 当多个运算符并列时,先运算哪个? 运算符的结合性 当相同优先级的运算符并列时,先运算哪个? 栈的应用:表达式的表示 前序表达式 特点: 运算数顺序跟中序表达式相同 运算符按照运算顺序的逆序排列 运算符在运算数之前 栈的应用:表达式的计算 手工计算方法: 前序表达式 取最后面的运算符 取当前运算符后面的两个数作为运算数 运算结果放到原来运算符的位置上 循环,直到所有的运算符都运算完毕 后序表达式?同学们自己总结 栈的应用:表达式的计算 中序表达式的计算机求解 1 + 2 * 3 / 4 - 5 计算机扫描表达式是从左到右的 但是运算顺序不一定是从左到右 也就是说有一些运算符可能要先被搁在一边,等会儿再计算它 所以需要利用某种数据结构“记忆”原先扫描过的一些符号,以便回头再计算它 很自然的想到要使用栈 栈的应用:表达式的计算 如何保证栈顶符号优先级最高呢? 当前符号想要入栈,必须优先级比栈顶的高 算法关键 用两个栈分别存放运算符和运算数 栈的应用:表达式的计算 另外,为了便于判断结束 在表达式末尾和栈底各增加一个符号# #优先级最最低 优先级表(设算符θ1出现在算符θ2前) 栈的应用:表达式的计算 括号怎么办? 因为括号分两半,所以需要分别考虑 当(在栈内时,优先级应为最低 这样保证括号内的符号可以入栈运算 当(在栈外时,优先级应为最高 这样保证括号可以入栈运算 当)在栈外时,优先级应为最低 这样保证括号内
您可能关注的文档
最近下载
- 非煤矿山安全生产检查表.docx VIP
- 基于STM32的智能物流分拣系统的应用与研究.pdf VIP
- 社会主义从一国到多国发展与苏联模式(下)——《社会主义发展简史》之七PPT课件.pptx VIP
- 2024春实验班提优大考卷5年级下数学(苏教)-答案.pdf
- (正式版)DB15∕T 1428-2024 《大型并网光伏发电站运行维护规程》.pdf VIP
- DB37_T 398-2004 沙化荒漠化土地监测技术规程(山东省).pdf VIP
- 广东省佛山市南海区2024-2025学年六年级上学期11月期中科学试题(无答案).pdf VIP
- 网络金融与传统金融比较.docx VIP
- (2025)汽车驾驶员高级技师基本理论知识考试题附含答案.docx VIP
- 金光集团生产安全手册.docx VIP
文档评论(0)