#include #include #include #define MAX_LEN 100 typedef struct { char prvky[MAX_LEN]; int vrchol; } Zasobnik; void inicializujZasobnik(Zasobnik *z); int jePlny(Zasobnik *z); int jePrazdny(Zasobnik *z); void vloz(Zasobnik *z, char prvok); char vyber(Zasobnik *z); int suZosuladene(char otvaracia, char zatvaracia); void skontrolujZatvorky(const char *kod); int main() { char kod[MAX_LEN + 1]; fgets(kod, sizeof(kod), stdin); kod[strcspn(kod, "\n")] = '\0'; printf("Read: %s\n", kod); skontrolujZatvorky(kod); return 0; } void inicializujZasobnik(Zasobnik *z) { z->vrchol = -1; } int jePlny(Zasobnik *z) { return z->vrchol == (MAX_LEN - 1); } int jePrazdny(Zasobnik *z) { return z->vrchol == -1; } void vloz(Zasobnik *z, char prvok) { if (!jePlny(z)) { z->prvky[++z->vrchol] = prvok; } } char vyber(Zasobnik *z) { if (!jePrazdny(z)) { return z->prvky[z->vrchol--]; } return '\0'; } int suZosuladene(char otvaracia, char zatvaracia) { switch (otvaracia) { case '{': return zatvaracia == '}'; case '[': return zatvaracia == ']'; case '<': return zatvaracia == '>'; case '(': return zatvaracia == ')'; default: return 0; } } void skontrolujZatvorky(const char *kod) { Zasobnik z; inicializujZasobnik(&z); int pozicia = 0; for (const char *ptr = kod; *ptr != '\0'; ptr++, pozicia++) { char aktualny = *ptr; if (aktualny == '{' || aktualny == '[' || aktualny == '<' || aktualny == '(') { vloz(&z, aktualny); } else if (aktualny == '}' || aktualny == ']' || aktualny == '>' || aktualny == ')') { if (jePrazdny(&z)) { printf("Unexpected closing bracket %c in %d\n", aktualny, pozicia); return; } char poslednaOtvaracia = vyber(&z); if (!suZosuladene(poslednaOtvaracia, aktualny)) { printf("Crossed bracket %c at position %d, expected '%c'\n", aktualny, pozicia, (poslednaOtvaracia == '{') ? '}' : (poslednaOtvaracia == '[') ? ']' : (poslednaOtvaracia == '<') ? '>' : ')'); return; } } } if (!jePrazdny(&z)) { printf("Unexpected end of input, unmatched '%c'\n", vyber(&z)); return; } printf("All brackets OK\n"); }