【随记】20.有效括号

文章讲述了如何使用栈数据结构解决有效括号问题,强调在编程时应先分析可能的错误情况,如括号数量不匹配或排列错误。提供的代码示例展示了如何通过Java实现括号匹配检查,特别是注意栈空和栈顶元素与当前字符的比较顺序。
摘要由CSDN通过智能技术生成

有效括号。括号匹配题。

思想:用栈实现。思考不匹配的情况有哪些:

1).数量不匹配,如果字符数量为奇数,那么一定不匹配。

2).数量匹配的情况下,不匹配情况:"{[)}"、"))"、"(("。

ps:

1.不要直接看完题就开始写代码,要分析不匹配的情况有哪些,想清楚了再写。(第一次就是直接开写,结果越写越乱)

2.最后return的是st.empty(),非常巧妙,可以应对"(("这种情况。

3.注意st.empty() || st.top() != s[i],两个的顺序不能调换,必须先判断st是否为空,如果反过来,先 判断st.top() != s[i],st为空时会报错

代码:

class Solution {
public:
	bool isValid(string s) {
		stack<char> st;
		if (s == "") 
			return true;

		int n = s.size();
		if (n % 2 != 0) //([]数量不符
			return false;
		for (int i = 0;i < s.size();i++) {
			if (s[i] == '{')
				st.push('}');
			else if (s[i] == '[')
				st.push(']');
			else if (s[i] == '(')
				st.push(')');
			//"{[)}" "()))" 数量符合,不匹配
			else if (st.empty() || st.top() != s[i]) 
					return false;
			else st.pop();
		}
		return st.empty();
	}
};

附一个第一次写的垃圾代码(会报错,因为最后没有return,中间已经绕晕了,最后都不知道怎么return了):

class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        // string s = "([]}";
        if (s == "") {
            cout << "true" << endl;
            return true;
        }
        for (int i = 0;i < s.size();i++) {
            cout << s[i] << endl;
            if (s[i] == '{')
                st.push('}');
            else if (s[i] == '[')
                st.push(']');
            else if (s[i] == '(')
                st.push(')');
            else {
                if (st.empty()) {
                    cout << "false" << endl;
                    return false;
                }
                if (st.top() != s[i]) {
                    cout << "false" << endl;
                    return false;
                }
                else {
                    st.pop();
                    if (st.empty() && i == s.size() - 1) {
                        cout << "true" << endl;
                        return true;
                    }
                    if (!st.empty() && i == s.size() - 1) {
                        cout << "false" << endl;
                        return false;
                    }
                }
            }
        }
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值