LeetCode.20 有效的括号

原题链接:

LeetCode.20 有效的括号


本题是很经典的一道栈的入门题,我们可以从反面考虑什么情况不符合要求,大致分为以下三种情况:

     1.左右括号数量不匹配;

     2.不同括号相互交错;

     3.左右括号的位置不对;

我们考虑用栈来储存三种左括号,每一次如果出现的是左括号就入栈,当出现右括号且与栈顶的左括号匹配时就看作匹配成功,将栈顶元素弹出;

如果栈顶元素与右括号不匹配或者是出现右括号时栈为空时,可以直接判断匹配失败,并直接标记(此时出现了不同括号相互交错或者是先出现右括号而没有左括号的问题)。

当最后栈为空且没有被标记时,可以认为匹配成功。

代码如下:

class Solution {
public:
    bool isValid(string s) {
     char stack[10001] = {' '};
     int a = 0,len = s.length(),jud = 0; // jud 用于标记
     bool c = true;
     for(int i = 0;i < len;i++)
     {
         if(s[i] == '(')
         {
             stack[++a] = '(';
         }
         else if(s[i] == '{'){
             stack[++a] = '{';
         }
          else if(s[i] == '['){
             stack[++a] = '[';
         }
         else if(s[i] == ')'){
            if(stack[a] == '(')
               a--;
            else
               jud = 2; // 已经出现了不可能匹配的情况,直接标记
         } 
           else if(s[i] == '}'){
            if(stack[a] == '{')
               a--;
            else
               jud = 2;
         } 
           else if(s[i] == ']'){
            if(stack[a] == '[')
               a--;
            else
               jud = 2;
         }   
     }
     if(a == 0 && jud != 2)
        c = true;
     else
        c = false;

     return c;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值