【数据结构】栈的用法——括号匹配

给出了一个长度为 n 的字符串,这个字符串仅包含 "{" 和 "}" 这两种括号。你需要根据给定的字符串来判断其括号是否匹配合理,如果合理则输出 YES,否则输出 NO。例如 {{{}}},{}{},{{}{}} 是合理的,而 {{}}},{}{{}{,{{{}{} 是不合理的。

输入描述:

 第一行输入一个整数 (1≤t≤100),代表样例组数。
 ​
 接下来 t 行,每行输入一个长度为 n(1≤n≤1000) 的字符串。

输出描述:

 共 t 行,每行若字符串合理则输出 YES,否则输出 NO。
 ​
 您可以在任何情况下打印每个字母无视大小写区分(例如,YES、Yes、yes、yEs 都将被识别为正确答案)。                   

输入

 4
 {
 {}}
 {}{}{{}}
 }{

输出

 NO
 NO
 YES
 NO

经典的括号匹配类题,特点:单一对应,括号有先后之分 使用数据结构中的栈来解决是常见的思路

  1. 前提及思路

    1. 定义变量string s; stack<int>st; int mark=1;

    2. 先不输入s[i],先判断

    3. 保证栈内为空或只有'}'

    4. mark记录特殊情况

  2. 过程判断

    1. 如果栈为空

      1. 如果s[i]为'}' mark=0

      2. 如果s[i]为'{' 输入'{'

    2. 如果栈不为空

      1. 如果s[i]为'}' 消去栈内一个'{'

      2. 如果s[i]为'{' 输入'{'

  3. 结果判断

    1. 栈为空 则为YES

    2. 栈不为空或者出现'}'时,'}'的左侧没有'{' 则为NO

    以下为完整源代码

 #include <iostream>  
 #include <stack>  
 using namespace std;  
 int main(){  
     int t;  
     cin>>t;  
     while(t--){  
         int mark=1;  
         string s;  
         stack<int>st;  
         cin>>s;  
         for(int i=0;i<s.size();i++){  
             if(st.empty())  
             {  
                 if(s[i]=='}')  
                 {  
                     mark=0;  
                     break;  
                 }  
                 if(s[i]=='{')  
                     st.push(s[i]);  
             }  
             else if(!st.empty())  
             {  
                 if(s[i]=='}')  
                     st.pop();  
                 if(s[i]=='{')   
                     st.push(s[i]);  
             }  
         }  
         if(mark&&st.empty()) cout<<"YES"<<endl;  
         if(!mark||!st.empty()) cout<<"NO"<<endl;  
     }  
     system("pause");    
     return 0;  
 }     
 ​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值