Sicily课程练习 1007. Bracket Matching

题目描述:

思路:遍历字符串,遇到左括号入栈,遇到右括号,判断是否匹配,若不匹配,呵呵。若匹配,左括号出栈,继续遍历,最后若没有未得到匹配的左括号和右括号,则视为匹配;

坑爹的地方:

比如你要注意}{也是不匹配的,还有你要小心"[         ]aaa"这种中间/前面带有空格的字符串,不清楚测试用例是否有,但是这只是作为字符串处理类型的题目的一个提醒。

代码+注释:

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
//cin对象不适合用来读入字符串对象,因为它在遇到第一个空格时就会停止录入,故对字符串处理类型的题目,
//要小心字符串中间有空格的情况

//另一个情况就是对于这种括号匹配的题目,如")( }{ ]["应该是不匹配的,所以你想要通过开6个变量来记录
//括号的个数,从而实现判断匹配与否是不可行的!!(如下面的代码)
/*int main(){
    int i, txcase;
    string tocheck;

    cin >> txcase;//这里另一点值得注意的是,在getline前面如果需要使用cin语句,应该在
                  //cin语句下一句加一个cin.ignore();
    cin.ignore();

    while(txcase--){
       int braket_left = 0;
       int braket_right = 0;
       int brace_left = 0;
       int brace_right = 0;
       int square_bk_left = 0;
       int square_bk_right = 0;

       getline(std::cin,tocheck);

       for(i = 0;i < tocheck.length();i++){
          switch(tocheck[i]){
            case '{':brace_left++;break;
            case '}':brace_right++;break;
            case '(':braket_left++;break;
            case ')':braket_right++;break;
            case '[':square_bk_left++;break;
            case ']':square_bk_right++;break;
          }
       }
       //debug
       cout << "for debug"<<endl << tocheck << "debug" << endl;

       if(brace_left == brace_right && braket_left == braket_right && square_bk_left == square_bk_right)
          cout << "Yes" << endl;
       else
          cout << "No" << endl;
    }

      system("pause");
    return 0;
}
*/

#include <stack>
int main(){
  stack<char> storerof_bk;
  int i, txcase;
  string tocheck;
  bool flag;//flag用于记录是否出现下面的for语句的后两个if()语句的情况,默认为不出现

  cin >> txcase;
  cin.ignore();
  while(txcase--){
     flag = false;
     getline(std::cin,tocheck);

     for(i = 0; i < tocheck.length();i++){//遍历字符串
        if(tocheck[i] == '(' || tocheck[i] == '[' || tocheck[i] == '{')//遇到左括号就进栈
          storerof_bk.push(tocheck[i]);

        if((tocheck[i] == ')' || tocheck[i] == ']' || tocheck[i] == '}') && !storerof_bk.empty()){
            if(tocheck[i]== ')' && storerof_bk.top() == '(')//遇到右括号且栈非空,就开始判断匹配,如果匹配,出栈
              storerof_bk.pop();
            else if(tocheck[i]== ']' && storerof_bk.top() == '[')
              storerof_bk.pop();
            else if(tocheck[i]== '}' && storerof_bk.top() == '{')
              storerof_bk.pop();
            else{
              flag = true;
              break;
            }
        }
        else if((tocheck[i] == ')' || tocheck[i] == ']' || tocheck[i] == '}') && storerof_bk.empty()){
          //也有此时只包含右括号的字符串的情况,这种情况,左括号的栈已经为空,故需要单独判断
          flag = true;
          break;
        }
     }

     //走完循环之后还得判断输出
     if(!flag && storerof_bk.empty())
        cout << "Yes" << endl;
     else
        cout << "No" << endl;

     //debug
      //cout << "debug" << endl;
     while(!storerof_bk.empty()){//最后还要注意清空栈
        storerof_bk.pop();
     }
  }

  system("pause");
  return 0;
}
原文地址:https://www.cnblogs.com/nomonoyumei/p/3484624.html