如何找到所有支架是否平衡(C)

时间:2017-03-09 09:12:27

标签: c algorithm

所以我有一个充满括号的数组,例如:

1)(()())())((())(())

2)()((()()))

任何开放式括号('(')也应该被另一个(')')

关闭

所以例如1) - >

(()())())((())(()) - >(....)..)((..)(..) - >())(( )() - >。)(..,所以答案是否定的,因为从这里我们可以看到并非所有的括号都是平衡的

例如2) - >

()((()())) - > 。((..)) - > (()) - > (..) - > () - > ..,所以答案是肯定的,因为所有括号都是平衡的。在这种情况下,我还想打印平衡的所有括号对的位置,例如:

1,2& 5,6& 7,8& 3,10& 4,9

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~

2 个答案:

答案 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;