- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)