问题描述:
如果给你一个字符串,它只包含下面的几个字符:’(‘、’)’、’{‘、’} ’、’[’、‘]’,你需要判断输入的字符串是否是一个有效的圆括号字符串。例如“((([[]])))”是有效的,但是“{{}”和“((”则不是。
提示:
比较明显的是,为了判断有效,我们必须从头扫描整个字符串,问题在于我们不能立即判断,因为当前节点依赖后续节点,因此我们需要将栈作为辅助工具。
思路:细分字符串错误的原因主要有2点。
1.stack中的数据没有正常的完全pop出来,其中可能字符串的顺序(如:{[[[(((]]]]})、数目(如:[[[[[((()的不匹配,或者在字符串的中间穿插有完整的括号组(如:[[[](())]])
2.多个完整的字符串被输入(如:[][[]][[{{}}]])
提高分辨速度:
如果一个字符串正确的话,长度一定会是偶数,可以先把长度为奇数的排除。对于长度满足要求的字符串,首先将一半的字符push到stack中,再来逐个检查剩下的字符,若stack中的字符完全被pop掉,则说明字符串正确,若只要有一次的pop没有执行,都认为字符串不正确,需要重新输入。最后,根据前面的判断,若字符串正确,则退出程序,否则重新输入,直到输入正确。
具体代码如下:
int main(void)
{stack<char> c;
string temp;
bool rewrite(true);
cin >> temp;
while (rewrite)
{
int size_temp = temp.size();
rewrite = false;
if (size_temp % 2 == 0)
{
for (int i = 0; i != size_temp / 2; ++i)
{
c.push(temp[i]);
}
for (int i = size_temp / 2; i != size_temp; ++i)
{
if (temp[i] == ']' || temp[i] == ')' || temp[i] == '}')
{
c.pop();
rewrite = false;
}
else
{
rewrite = true;
break;
}
}
}
else
{
rewrite = true;
}
if (rewrite == true)
{
cout << "请重新输入!" << endl;
cin >> temp;
}
else
{
cout << "输入正确,通过!" << endl;
}
}
return 0;
}