网站大量收购独家精品文档,联系QQ:2885784924

客栈的应用-括号匹配.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
客栈的应用-括号匹配

堆栈的应用: 应用例子1——编译器中的应用 堆栈的一个应用是在程序中匹配分隔符。这是一个重要实例,因为分隔符的匹配是任意编译器的一部分:如果分隔符不匹配,程序就不可能正确。 程序中通常有如下分隔符:圆括号“(”和“)”,方括号“[”和“]”,大括号“{”和“}”以及注释分隔符“/*”和“*/”。 分隔符匹配的例子: a = b + ( c - d ) ? ( e – f ) ; g [10] = h [ i[9] ] + ( j + k ) ? l ; while ( m ( n[8] + o )) { p = 7 ; /? initialize p ?/ r = 6 ;} 分隔符不匹配的例子: a = b + ( c - d) ? ( e – f ) ) ; g[10] = h[ i[9] + ( j + k ) ? l ; while ( m ( n[8] + o ]) { p = 7 ; /? initialize p ?/ r = 6 ;} 从file 中读入字符ch1 . Nch1 N ch1 ? “\n” Y Y 不是分隔符ch1 ? “\n” 文件没结束 不是分隔符 “(” 或“[”或“{” “/” “*” “)” 或“]”或“}” 看下一个字符是否是“/”,如果是,判断字符 看下一个字符是否是“/”,如果是,判断字符“*”“/”与栈顶及次栈顶字符是否匹配,如果不匹配,出错;如果匹配,将栈顶及次栈顶字符弹出 看与栈顶字符是否匹配,如果不匹配,出错;如果匹配,将栈顶字符弹出。 看下一个字符是否是“*”,如果是,压栈 从file 中读入下一个字符ch1 . 栈是否为空? 为空,结束 不空,出错。 算法 delimitermatching(file. flag) CREATS(S). 从file中读入字符ch1. //设“\n”表示文件结束 while ch1 ? “\n” do ( if (ch1=“(”) OR (ch1=“[” ) OR (ch1=“{” ) //第一种情况 then push(ch1). else if ch1 = “/” //第二种情况 注意顺序then( 注意顺序 读入下一个字符ch2 . if ch2=“*” then ( push(ch1). push(ch2). ) ) else if (ch1=“)”) OR (ch1=“]”) OR (ch1 = “}”) then ( //第三种情况 ch2 ??peek(). if NOT ( (ch1=“)” AND ch2=“(”) OR (ch1=“]” AND ch2=“[”) OR (ch1=“}” AND ch2=“{”) ) then ( flag? fail. return .)//匹配失败 else pop(). //匹配成功 ) else if ch1=“*” //第四种情况 then ( 读入下一个字符ch2 . if ch2=“/” then ( ch3?peek(). ch4?s[top-1].//取次栈顶元素 if NOT ( ch1=ch3 AND ch2 = ch4 ) then ( flag? fail. return .) else ( pop(). pop(). ) ) //else 忽略其他字符 从file 中读入下一个字符ch1 . ) endwhile if NOT stackisempty() then ( flag? fail. return .) ?

文档评论(0)

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

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

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档