C++中的类与对象:合法括号的判断

任务要求:输入一个由括号'(',')','{','}','[',']'组成的字符串,判断字符串是否合法,写程序完成此转换,要求使用class类。部分代码已给出,请将代码填补完整。合法是指括号按顺序结束,如‘()’‘([])’是有效的,而’{]’’([)]’不是合法的。

思路:挨个判断每一个括号是否能在整个数组中找到配对的括号,同时判断其相邻处是否有其他类型的且方向相同的括号,从而排除括号被截断的情况。括号的顺序位置都重要。

#include <iostream>
#include <string>
using namespace std;

class Solution {
public:
    bool isValid(string s) {
        bool res = 0;
        int i = 0;
        while( i<s.length() ){
            if (s[i] == '(') {
                int j = i + 1;
                while ((s[j] != ')' && j < s.length())) {
                    j++;
                }
                if (s[j] == ')' && s[i + 1] != ']' && s[i + 1] != '}') { i++; }
                else break;
            }
            else if (s[i] == '[') {
                int j = i + 1;
                while ((s[j] != ']' && j < s.length())) {
                    j++;
                }
                if (s[j] == ']' && s[i + 1] != ')' && s[i + 1] != '}') { i++; }
                else break;
            }
            else if (s[i] == '{') {
                int j = i + 1;
                while ((s[j] != '}' && j < s.length())) {
                    j++;
                }
                if (s[j] == '}' && s[i + 1] != ')' && s[i + 1] != ']') { i++; }
                else break;
            }//如果找完了所有的左括号了都没问题,我们到了右括号的位置:
            else {
                if (s[i] == ')') {
                    int j = i - 1;
                    while (s[j] != '(' && j > 0) {
                        j--;
                    }
                    if ((s[j] == '(') && s[i - 1] != '[' && s[i - 1] != '{') { i++; }
                    else break;
                }
                else if (s[i] == ']') {
                    int j = i - 1;
                    while (s[j] != '[' && j > 0) {
                        j--;
                    }
                    if ((s[j] == '[') && s[i - 1] != '(' && s[i - 1] != '{') { i++; }
                    else break;
                }
                else if (s[i] == '}') {
                    int j = i - 1;
                    while (s[j] != '{' && j > 0) {//这里有个问题是最后整了一个s[-1]。。。
                        j--;
                    }
                    if ((s[j] == '{') && s[i - 1] != '[' && s[i - 1] != '(') { i++; }
                    else break;
                }
            }
        }
        if (i == s.length()) res = 1;//为什么不是i+1:因为最后一个字符如果通过的话i还会加一,所以这里不用加1
        return res;
    }
};

    int main() {
        Solution s;
        string str;
        getline(cin, str);
        bool res = s.isValid(str);
        cout << res;
        return 0;
    }

个人认为较好的几个测试例:

  • ()[]}:一个右括号找不到配对左括号的情况。
    • 可能存在的问题是,在挨个查找右括号的配对括号的时候使用了自减(j--),自减如果成了负数,在字符数组中可能引发报错。
    • 解决方法:循环终止条件写为j<0而非j<=0,然后在循环外判断j=0的边界情况
  • ([]){}:合法情形
  • ([)]:括号被截断的情形
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值