20.有效的括号

原题链接:20.有效的括号

看到这种需要双双匹配的题目,就感觉可以使用栈来做
题目要求是:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.每个右括号都有一个对应的相同类型的左括号。

还需要注意
栈为空的时候插入的是右括号的情况该怎么办?
如果栈里只有左元素没有右元素该怎么办?
匹配完后栈不为空怎么办?
注意好以上几点,配合上题目,利用栈就可以写出相关代码了

全代码:

class Solution {
public:
    bool isValid(string s) {
        stack<char> left;

        for(int i = 0; i < s.size(); i++)
        {//遍历字符串 开始匹配
            if(s[i] == '(' || s[i] == '[' || s[i] == '{')
            {//往栈内存储左括号
                left.push(s[i]);
            }
            else if((s[i] == ')' || s[i] == ']' || s[i] == '}') && (!left.empty()))
            {//1.栈不为空,插入的是右括号,则需要和存储左括号的栈进行匹配
                if((s[i] == ')' && left.top() == '(') && (!left.empty()))
                {//栈里有匹配的左元素且栈不为空,那么代表有一对匹配的括号了,弹出栈顶元素,进入下一个s[i]判断
                    left.pop();
                }else if((s[i] == ']' && left.top() == '[') && (!left.empty()))
                {
                    left.pop();
                }
                else if((s[i] == '}' && left.top() == '{') && (!left.empty()))
                {
                    left.pop();
                }
                else
                {//压入的右括号和左括号不匹配,又或者是压入右括号时栈为空,则返回false
                    return false;
                }
            }else
            {//2.栈为空,插入的是右括号,则代表不是按顺序闭合,直接返回false
                return false;
            }
        }
        
        if(left.size() == 0)
        {//到最后栈为空,则代表所有括号都进行了匹配,返回true
            return true;
        }

        //不为空,则代表没有全部进行匹配 返回false
        return false;
    }
};

你可能感兴趣的:(算法,数据结构,leetcode)