验证打开和关闭括号的数量

时间:2014-01-31 21:52:34

标签: c++

需要编写一个函数来检查行中大括号放置的有效性。 如果左括号对应于大致相同的闭合,则该函数应返回true。 输入字符串的示例:“(())) ()) ()

发布了两种解决方案。哪个更好,有更好的方法来解决问题?

1:

bool parenthesis(char myString[80]) {
    int k = 0;
    for (int i = 0; myString[i]; ++i) {
        if (myString[i] == '(')
            k++;
        if (myString[i] == ')')
            k--;
    }
    if (k == 0)
        return true;
    else
        return false;
}

2:

#include <algorithm>
#include <iostream>
#include <string>

int main()
{
    std::string str = "(()))())()";
    std::cout << std::boolalpha
              << (std::count(str.begin(), str.end(), '(') == 
                  std::count(str.begin(), str.end(), ')') && *str.begin() ==
                  '(' && *str.rbegin() == ')')
              << std::endl;
}

3 个答案:

答案 0 :(得分:4)

这很容易做到只需为(添加一个,为)减去一个,同时注意总和永远不会消极。最后它必须为零。

答案 1 :(得分:3)

两者似乎都不是最佳的,因为它们会将字符串验证为

()))((()

我可能会做计数,但另外检查一下这个数字总是非负数。

bool validate_parantheses(const std::string& str)
{
    int count = 0;
    for(char c : str)
    {
        if(c == '(')
            count++;
        else if(c == ')')
            count--;
        if(count < 0)
            return false;
    }
    return count == 0;
}    

答案 2 :(得分:0)

解决方案1更具可读性,允许您更轻松地修复错误(在两个解决方案中)。请参阅添加的“return false”。

bool parenthesis(char myString[80]) {
    int k = 0;
    for (int i = 0; myString[i]; ++i) {
        if (myString[i] == '(')
            k++;
        if (myString[i] == ')')
            k--;
        if (k<0) // This was missing from your original algorithm.
            return false;
    }
    if (k == 0)
        return true;
    else
        return false;

请注意,如果它需要支持任何真实的解析问题,例如不同类型的大括号,那将会更复杂:([[()]]){} {{(())}}

如果您有这样的问题,其他人提到的“堆栈”解决方案会更好用,因为您可以将打开的括号推到堆栈上,当您找到一个紧密的支撑时,从堆栈的顶部弹出打开并验证这是正确的类型。