1. здесь используется что-то вроде стека... это я написал позднее чем 2 вариант... smile.gif

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define pause printf("\nenter ctrl+z to exit...");	while (getchar() !=EOF);
#define close_br s[i]==']'||s[i]==')'||s[i]=='>'||s[i]=='}'
#define open_br s[i]=='['||s[i]=='('||s[i]=='<'||s[i]=='{'

char close(char c){
	if (c=='[') return ']';
	if (c=='(') return ')';
	if (c=='{') return '}';
	if (c=='<') return '>';
	return 0;
}

char* stack;
int count=0;

void init_stack(int len) {
	int i=0;
	for (stack=(char*)malloc(len*sizeof(char)); i<len; i++) stack[i]=0;
}


 void pop(char* s, int i){
	*(stack+(count++))=*(s+i);
	stack[count]=0;
 }
 
 char push(){
	char temp=*(stack+((count--)-1));
	stack[count]=0;
	return temp;
 }
 
void create_stack(char *s){
	for (int i=0,len=strlen(s); i < len; i++ ) {
		if (open_br||close_br) pop(s,i);
		if (count > 0 && close_br) { 
			char T1 = push(), T2 = push(); 
			if (T1!=close(T2)) {
				pop(&T2,0);
				pop(&T1,0);
				return;
			}
		}
	}
	if (count==0) {free(stack); stack=NULL; }
}


int main() {
	printf("Checking of brackets' balance\n enter string\n");
	char *s=(char*)malloc(255*sizeof(char));
	gets(s); 
	init_stack(strlen(s));
	create_stack(s);
	printf("stack: \'%s\' # count: %d # balance : %d",stack,count,count==0); 
	pause;	
	if (stack!=NULL) free(stack);
}


2. вариант. это я переделал на СИ вот этот алгоритм. smile.gif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define pause_loop printf("\nenter ctrl+z to exit...");	while (getchar() !=EOF);

char close(char c){
	if (c=='[') return ']';
	if (c=='(') return ')';
	if (c=='{') return '}';
	if (c=='<') return '>';
}

char* delete_ (char *sources, int n, int count) {
	char *g=sources; int j=0, length=strlen(sources);
	if (length>=n+count) {
		for (int i=0; i<=length; i++) if ((i<n) || (i>=n+count)) *(g+(j++))=sources[i];
		g[j]=0; //???
		return g;
	} else { 
		return NULL;
	}
}	


char* modify_str (char* p) {
	// only  { } [ ] ( ) < >
	char *g=p; int j=0, length=strlen(p);
	for (int i=0; i<=length; i++) 
		if (p[i]=='{' || p[i]=='}' || p[i]=='[' || p[i]==']' || p[i]=='(' || p[i]==')' || p[i]=='<' || p[i]=='>') *(g+(j++))=p[i];
	g[j]=0;
	return g;
}

int main(){
	printf("[]()<>{} ... \n");
	char *s;
	s=(char*)malloc(255*sizeof(char));
	gets(s);
	s=modify_str(s);
	for (int i=0, len= strlen(s); i<=len; i++) {
		for (int j=0; j<=strlen(s); j++) {
			if (close(s[j])==s[j+1]) delete_(s,j,2);
		}
	}
	if (strlen(s)!=0)	printf("error: %s \n",s); else printf("OK!");
	free(s);	
	pause_loop;
}


p.s. компилятор MinGW ...