• 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;
    }
  • 相关阅读:
    Ajax实现表格实时编辑
    自定义简单分页
    有趣的 0
    关于AJAX的一些事
    JQ中的FormData对象 ajax上传文件
    订单导出
    javaScript事件委托
    javascript递归函数
    详解javascript中this的工作原理
    详解JavaScript对象继承方式
  • 原文地址:https://www.cnblogs.com/nomonoyumei/p/3484624.html
Copyright © 2020-2023  润新知