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 ...