3 条题解

  • 3
    @ 2023-8-21 22:28:26

    发现唯一一个老哥的题解还是py

    是时候展示真正的技术了!

    已AC,放心食用

    #include<iostream>
    #include<stack>
    using namespace std;
    bool left(char s) {
        return s=='(' || s=='{' || s=='[';
    }
    bool right(char s) {
        return s==')' || s=='}' || s==']';
    }
    bool check(char a,char b) {
        return (a=='(' && b==')') || (a=='{' && b=='}') || (a=='[' && b==']');
    }
    bool match(string s)
    {
        stack<char> p;
        for(unsigned int i=0; i<s.size(); i++)
        {
           if(left(s[i])) {
               p.push(s[i]);
           }else if(right(s[i])) {
               if(!p.empty() && check(p.top(),s[i])) { //栈不空,且匹配正确
                   p.pop();
               } else {
                   return false; //不匹配,直接返回false
               }
           }
     
        }
        if(!p.empty()) return false; //栈不空,说明存在没有匹配的左括号,返回false
        return true; //全都匹配成功
    }
    int main(){
        string s;
        cin >> s;
        if (match(s)){
            cout << "yes";
        }else{
            cout << "no";
        }
        return 0;
    }
    
    • 0
      @ 2024-2-18 12:46:42

      栈的基础应用

      #include <bits/stdc++.h>
      using namespace std;
      string t;//t字符串存储括号
      stack<char>s;//栈,char类型
      string::iterator it;//这个是迭代器的定义,知道STL的都知道
      /*
      STL小知识->迭代器
      迭代器有3种--随机迭代器,双向迭代器,没有迭代器
      随机迭代器:迭代器可以比大小,还能使用下标
      双向迭代器:不能比大小,只能用迭代器
      没有迭代器:迭代器都不能用
      迭代器定义:STL<type>::iterator it;
      反向迭代器定义:STL<type>::reverse_iterator it;
      STL迭代器:begin(),end();
      STL反向迭代器:rbegin(),rend()
      -------------------------------------
      STL容器&&迭代器
      vector(动态数组)随机迭代器
      deque(双向队列)随机迭代器
      string(字符串)随机迭代器
      list(链表)双向迭代器
      set(集合)双向迭代器
      map(映射)双向迭代器
      stack(栈)没有迭代器
      queue(队列)没有迭代器
      priority_queue(优先队列)没有迭代器
      --------------------------------------
      迭代器遍历
      正向:for(it=s.begin();it!=s.rend();it++)cout<<*it<<" ";
      反向:for(it=s.rbegin();it!=s.end();it++)cout<<*it<<" ";
      ----------------------------------------
      附赠迭代器遍历
      for(auto b:s)
      */
      int main(){
          cin>>t;//输入字符串
          s.push('#');//为了保证栈不为空
          for (it=t.begin();it<t.end();it++){//迭代器正向遍历
              if (*it=='('||*it=='[')s.push(*it);//如果是左括号,括号入栈
              else{//是右括号
                   //判断是否有匹配左括号,有弹出栈顶括号,没有,输出no
                   if (*it==')'&&s.top()=='('||*it==']'&&s.top()=='[')s.pop();
                   else {
                       cout<<"no";
                       return 0;
                   }
               }
          }
          if(s.size()==1)cout<<"yes";//输出
          else cout<<"no";
          return 0;
      }
      
      • 0
        @ 2022-12-4 16:29:20

        嗨嗨嗨,我又来了! 今天咱们聊聊括号匹配。说来惭愧,当年哥在比赛时遇到过这题,可惜当时不得其法,一分未得。现在我才发现,只因我当时不知道stack(栈)。


        栈的定义

        什么是栈?打个比方,假如你买了一筒乒乓球,这一筒乒乓球就可以看作栈。用时会打开筒口取。你取出的第一个球,是最后放进去的。而这个过程就叫出栈。同理,把乒乓球装入筒叫入栈。栈(stack)就是一种后进先出的数据结构。即最后一个进去的数据会在第一个被取出。


        思路

        这题的思路很简单,就是遇左入栈,遇右判断。意思就是说把左括号('(''[')入栈,碰到右括号就去栈顶(尾部)寻找左括号。一旦配对,左括号就没用了,移出去。最后判断栈是否为空,为空就成功了,否则配对失败。


        代码(Python)

        想不到吧,这题我用的是Python(^_^)!

        A=list(input())
        zero_stack=[]
        q=0#记录stack的长度
        for i in A:
            if i == '(' or i =='[':#遇左入栈
                zero_stack.append(i)
                q+=1
            else:
                if (zero_stack[q-1] == '[' and i == ']') or (zero_stack[q-1] == '(' and i == ')'):#遇右判断
                    zero_stack.pop()#作用:删除索引对应的数,默认删除最后一个。
                    q-=1
        if q:#q≠0为true
            print('no')#配对失败
        else:#反之配对成功
            print('yes')
        

        Loading:22/100……

        • 1

        信息

        ID
        483
        时间
        1000ms
        内存
        128MiB
        难度
        1
        标签
        递交数
        71
        已通过
        49
        上传者