1. здесь используется что-то вроде стека... это я написал позднее чем 2 вариант...
#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. вариант. это я переделал на СИ вот
этот алгоритм.
#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 ...