2024-10-31 17:45:54 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#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';
|
2024-10-31 17:50:22 +00:00
|
|
|
printf("Read: %s\n", kod);
|
2024-10-31 17:45:54 +00:00
|
|
|
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)) {
|
2024-10-31 17:59:45 +00:00
|
|
|
printf("Unexpected closing bracket %c in %d\n", aktualny, pozicia);
|
2024-10-31 17:45:54 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
char poslednaOtvaracia = vyber(&z);
|
|
|
|
if (!suZosuladene(poslednaOtvaracia, aktualny)) {
|
2024-10-31 17:59:45 +00:00
|
|
|
printf("Crossed bracket %c at position %d, expected '%c'\n",
|
2024-10-31 17:45:54 +00:00
|
|
|
aktualny, pozicia,
|
|
|
|
(poslednaOtvaracia == '{') ? '}' :
|
|
|
|
(poslednaOtvaracia == '[') ? ']' :
|
|
|
|
(poslednaOtvaracia == '<') ? '>' : ')');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!jePrazdny(&z)) {
|
2024-10-31 18:02:54 +00:00
|
|
|
printf("Missing closing brackets: ");
|
|
|
|
while (!jePrazdny(&z)) {
|
|
|
|
char nezodpovedajuca = vyber(&z);
|
|
|
|
printf("%c ",
|
|
|
|
(nezodpovedajuca == '{') ? '}' :
|
|
|
|
(nezodpovedajuca == '[') ? ']' :
|
|
|
|
(nezodpovedajuca == '<') ? '>' : ')');
|
|
|
|
}
|
|
|
|
printf("\n");
|
2024-10-31 17:45:54 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2024-10-31 17:50:22 +00:00
|
|
|
printf("All brackets OK\n");
|
2024-10-31 17:45:54 +00:00
|
|
|
}
|