我正致力于创建一个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;
}
}
答案 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()
{
}