usaa24/a1/program.c
2024-10-31 17:54:11 +00:00

101 lines
2.4 KiB
C

#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';
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");
}