20.有效的括号-力扣(LeetCode)


一、题目及示例(C++实现)

1. 题目

给定一个只包括

‘(’,‘)’ ,‘{’,‘}’,‘[’,‘]’

字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

2. 示例

示例 1:

输入:s = “()”
输出:true

示例 2:

输入:s = “()[]{}”
输出:true

示例 3:

输入:s = “(]”
输出:false

示例 4:

输入:s = “([)]”
输出:false

示例 5:

输入:s = “{[]}”
输出:true


二、思路及图解

一般遇到括号匹配的问题,我们可以首先想到利用栈这个C++中的容器适配器,因为它具有后进先出的特点。

在这个题目中,我们先遍历字符串s的每一个字符,这里的字符全都是括号,我们要判断右括号和离它最近的左括号是否匹配。如果它是左括号
如:‘(’,‘{’,‘[’,那么我们将与之匹配的右括号压入栈中,当遍历遇到s中的右括号,如果此时栈为空,那么证明在遇到这个右括号之前我们没有遇到左括号,即s的第一个字符就是右括号,那么一定是错误的,返回false;或者会有这样一种情况,栈不为空,但是栈中的右括号与其最近的左括号不匹配,这种情况也返回false。否则,将栈顶元素出栈即可。

如果最后栈为空,则证明右括号全部找到了与之匹配的左括号,全都出栈成功,返回true;如果栈不为空则说明存在右括号与左括号不匹配的情况,返回false。

在这里插入图片描述

在这里插入图片描述


三、代码

class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        for(auto e : s)
        {
            if(e == '(')
            {
                st.push(')');
            }
            else if(e == '{')
            {
                st.push('}');
            }
            else if(e == '[')
            {
                st.push(']');
            }
            //如果栈为空则说明s中全是右括号,返回false。
            //遍历到s中的右括号,如果右括号和栈顶的右括号不匹配,那么是错误的,返回false。
            else if(st.empty() || e != st.top())
            {
                return false;
            }
            //完全符合上述条件,出栈即可。
            else
            {
                st.pop();
            }
        }
        //如果最后栈为空,那么返回true,说明全部匹配成功;否则返回false。
        return st.empty();
    }
};
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值