所以我有一个充满括号的数组,例如:
1)(()())())((())(())
2)()((()()))
任何开放式括号('(')也应该被另一个(')')
关闭所以例如1) - >
(()())())((())(()) - >(....)..)((..)(..) - >())(( )() - >。)(..,所以答案是否定的,因为从这里我们可以看到并非所有的括号都是平衡的
例如2) - >
()((()())) - > 。((..)) - > (()) - > (..) - > () - > ..,所以答案是肯定的,因为所有括号都是平衡的。在这种情况下,我还想打印平衡的所有括号对的位置,例如:
1,2& 5,6& 7,8& 3,10& 4,9
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~
答案 0 :(得分:1)
在您的情况下,使用计数器就这么简单。 (
的增量和)
的减量。它不应该低于0,如果平衡,最后应该为0。
如果你正在创建一些像编译器和解释器那样的语法解析器,你可以考虑使用堆栈。
编辑:您需要使用堆栈打印出对。您需要在C中手动实现堆栈,因此以下是C ++中的参考代码。
std::stack<int> s;
switch(string[i]) {
case '(':
s.push(i);
break;
case ')':
if(!s.empty()) {
printf("%d, %d\n", s.top(), i);
s.pop();
} else {
// Fail here
}
break;
}
if(!s.empty()) // Fail here
答案 1 :(得分:0)
计算开始和结束括号:
const char* it;
int open_n = 0, close_n = 0;
/* Assume array is zero terminated.
* Otherwise condition: 'it != &array[ArraySize]' instead '*it' */
for(it = &array[0]; *it ; ++it) {
switch( *it ) {
case '(': open_n += 1; break;
case ')': if( open_n ) { close_n += 1; break; }
else { return false; /* ErrorCloseWithoutOpen */ }
default: break;
}
}
return open_n ? false : true;