leeetcode 20. 有效的括号

20. 有效的括号

问题描述

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true

问题分析

这个问题比较简单,只需要使用一个栈来存左括号即可,我们遍历每一个元素:
1 如果栈是空的并且遇到右括号,肯定是非法的,剩下情况只能是栈不空或者遇到左括号;
2.1 遇到左括号,则将左括号入栈;
2.2 如遇到右括号则需要比对与栈最顶上的左括号是否匹配,匹配则检查下一个元素,不匹配则非法;
3 最后遍历完每个元素如果栈仍然非空,说明左括号多了,所以非法

代码

class Solution {
public:
    bool isValid(string s) {
        int n = s.size();
        int i;
        stack<char> v;
        for(i = 0; i < n; i++)
        {
            if(v.empty() && (s[i] == ')' || s[i] == '}' || s[i] == ']'))
                return false;
            else{
                if(s[i] == '(' || s[i] == '{' || s[i] == '[')
                    v.push(s[i]);
                else{
                    if(s[i] == ')' && v.top() == '(') 
                    {
                        v.pop();
                        continue;
                    }
                    else if(s[i] == ']' && v.top() == '[') 
                    {
                        v.pop();
                        continue;
                    }
                    else if(s[i] == '}' && v.top() == '{') 
                    {
                        v.pop();
                        continue;
                    }
                    else 
                        return false;
                    }
                }
            }
        if(!v.empty())
            return false;
        else
            return true;
    }
};
posted @ 2019-11-18 16:21  曲径通霄  阅读(150)  评论(0编辑  收藏  举报