Я предполагаю, что идея такова: всегда разрешается открывающая область (в анализируемом тексте), но конечная часть должна соответствовать последней открытой.Вот почему требуется стек.Кроме того, в конце концов, если стек не пустой, это означает, что некоторые парены не были закрыты.
Итак, вам следует использовать стек, но только когда вы встречаете парены - либо открывающиеся, либо закрывающиеся.
В функции isBalanced () основной цикл может быть таким:
while (s[i] != '\0') {
if ( s[i] == '(' || s[i] == '{' || s[i] == '[' ) {
// opening - remember it
push(sptr, s[i]);
} else if ( s[i] == ')' || s[i] == '}' || s[i] == ']' ) {
// closing - it should match
if ( ! popmatch(sptr, s[i]) )
return n;
}
++i;
}
Остальная часть функции в порядке.Теперь я изменил функцию pop (): переименован в popmatch, потому что он должен проверять, совпадает ли аргумент с вершиной стека.Если это так, вытолкните стек и верните OK.Таким образом, функция будет выглядеть следующим образом:
char popmatch(STACK* sptr, char c) {
// an empty stack can not match
if (isEmpty(sptr))
return 0;
// not empty, can check for equality
if ( c =! sptr->s[sptr->top] )
return 0;
// does not match!
// ok, it matches so pop it and return ok
sptr->top--;
return 1;
}
Обратите внимание, что код довольно хорошо отражает «анализ»;когда анализ короткий и четкий, а код следует за анализом, результат часто также короткий и четкий.