Boolan-STL与泛型编程第二周实战

问题描述:

如果给你一个字符串,它只包含下面的几个字符:’(‘、’)’、’{‘、’} ’、’[’、‘]’,你需要判断输入的字符串是否是一个有效的圆括号字符串。例如“((([[]])))”是有效的,但是“{{}”和“((”则不是。

提示:

比较明显的是,为了判断有效,我们必须从头扫描整个字符串,问题在于我们不能立即判断,因为当前节点依赖后续节点,因此我们需要将栈作为辅助工具。

思路:细分字符串错误的原因主要有2点。

1.stack中的数据没有正常的完全pop出来,其中可能字符串的顺序(如:{[[[(((]]]]})、数目(如:[[[[[((()的不匹配,或者在字符串的中间穿插有完整的括号组(如:[[[](())]])

2.多个完整的字符串被输入(如:[][[]][[{{}}]])

提高分辨速度:

如果一个字符串正确的话,长度一定会是偶数,可以先把长度为奇数的排除。对于长度满足要求的字符串,首先将一半的字符push到stack中,再来逐个检查剩下的字符,若stack中的字符完全被pop掉,则说明字符串正确,若只要有一次的pop没有执行,都认为字符串不正确,需要重新输入。最后,根据前面的判断,若字符串正确,则退出程序,否则重新输入,直到输入正确。

具体代码如下:

int main(void)

{stack 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;

}

你可能感兴趣的:(Boolan-STL与泛型编程第二周实战)