3.3.1 栈在括号匹配中的应用
约 40 分钟
3.3.1 括号匹配:栈保存尚未闭合的承诺
从左到右扫描字符串。遇到左括号入栈;遇到右括号时,若栈空说明缺少左括号,若栈顶类型不同说明交叉错配,否则弹出。扫描结束后栈仍非空,说明有左括号未闭合。
bool matched(string s){ vector<char> st;
for(char c:s){
if(c=='('||c=='['||c=='{')st.push_back(c);
else if(c==')'||c==']'||c=='}'){
if(st.empty())return false;
char l=st.back(); st.pop_back();
if((l=='('&&c!=')')||(l=='['&&c!=']')||(l=='{'&&c!='}'))return false;
}
}
return st.empty(); }
栈顶必须与当前右括号匹配,因为最后打开的作用域必须最先关闭。([)] 数量相等却不合法:读到 ) 时栈顶是 [。
手工推演 {a+[b*(c-d)]}:依次压入 {、[、(;读 ) 弹 (,读 ] 弹 [,读 } 弹 {,最后为空。普通字符不改变栈。
错解反馈:只统计每类括号数量会漏掉嵌套顺序;遇右括号先弹栈再判断空会越界;扫描到末尾直接返回真,忘记检查剩余左括号。
迁移题:给出第一个错误位置,而非只返回真假。右括号失败时返回当前下标;扫描结束栈非空时需在栈中同时保存左括号下标。独立验收:通过空串、纯文本、正确嵌套、右括号过早、类型错配、左括号残留六类测试。
小纸条
判断括号串([)],给出第一个失败位置的原因。
登录 后可看答案
Practice
本课练习
先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。
本课练习正在补齐,暂不应标记为完成。