跳到正文

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

本课练习

0

先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。

本课练习正在补齐,暂不应标记为完成。