20.有效的括号

(写给未来遗忘的自己)(实习论文都ok了,接下来猛猛刷题)

题目:

代码: 

class Solution {
public:
    bool isValid(string s) {
        std::stack<char> s_stack;
        
        // 直接判断空字符串也是有效的情况
        if (s.size() % 2 != 0) return false;

        // 将 i 初始化为 0
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '(') {
                s_stack.push(')');
            } else if (s[i] == '[') {
                s_stack.push(']');
            } else if (s[i] == '{') {
                s_stack.push('}');
            } else {
                // 判断栈是否为空
                if (s_stack.empty() || s[i] != s_stack.top()) {
                    return false;
                }
                s_stack.pop();
            }
        }
        
        return s_stack.empty();
    }
};

 第一次写出错的地方:

if (s_stack.empty() || s[i] != s_stack.top()) {
                    return false;
                }
                s_stack.pop();

正确的写法是在匹配成功就是弹出了(意味着栈不是空的)。

但是匹配不成功分为两种情况:1.栈为空没有了。2.符号不对应。

思路:

对于符号来说,是呈现一个左右对称的。所以就是:正确的括号分别下将所有的左括号和右括号分开是一一对应的。从左往右走的左括号,对应从右往左走的右括号。所以利用栈的先进后出特性正好处理。

所以碰到左括号就在栈中保存相同类型的右括号,碰到右括号就检查是否和栈的top一致,判断是否正确。

知识点:

 栈是先进后出的机制,所以适合于处理左右匹配类型的题目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值