Simple C ++是嵌套的布尔方法

时间:2015-04-18 17:54:23

标签: c++ stack boolean

我正致力于创建一个C ++方法,该方法将使用堆栈来确定是否正确嵌套了一串括号。编译好了,但由于某种原因它总是返回true。我是否犯了一些非常明显的逻辑错误或什么?这是我的代码:

    bool isNested(string target)
    {
        stack<char> brackets;
        for (unsigned int i = 0; i > target.length(); i++)
        {
            if (target[i] == '<' || target[i] == '(' || target[i] == '{' || target[i] == '[')
            {
                brackets.push(target[i]);
            }
            else if (target[i] == '>' || target[i] == ')' || target[i] == '}' || target[i] == ']')
            {
                if (brackets.top() == '<' && target[i] == '>')
                {
                    brackets.pop();
                }
                else if (brackets.top() == '(' && target[i] == ')')
                {
                    brackets.pop();
                }
                if (brackets.top() == '{' && target[i] == '}')
                {
                    brackets.pop();
                }
                if (brackets.top() == '[' && target[i] == ']')
                {
                    brackets.pop();
                }
                else
                {
                    brackets.push(target[i]);
                }
            }
        }
        if (brackets.empty())
        {
            return true;
        }
        else
        {
            return false;
        }
    }

1 个答案:

答案 0 :(得分:1)

循环中的条件无效

for (unsigned int i = 0; i > target.length(); i++)

因为我被0初始化

unsigned int i = 0;

然后它不能大于target.length()

i > target.length();

该程序还包含其他错误。

例如此else语句的含义

            else
            {
                brackets.push(target[i]);
            }

不清楚。

该功能可以采用以下方式

#include <iostream>
#include <stack>
#include <string>
#include <cstring>

bool isNested( const std::string &target )
{
    const char *open  = "<([{";
    const char *close = ">)]}";
    std::stack<char> st;

    for ( char c : target )
    {
        const char *p;
        if ( ( p = std::strchr( open, c ) ) != nullptr && *p != '\0' )
        {
            st.push( c );
        }
        else if ( ( p = std::strchr( close, c ) ) != nullptr ) 
        {
            if ( st.empty() || open[p - close] != st.top() ) break;
            st.pop();
        }
    }

    return st.empty();
}

int main()
{
}