usaa24/a1/program.c

109 lines
2.7 KiB
C
Raw Permalink Normal View History

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 18:08:51 +00:00
printf("Crossed bracket %c in %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:05:16 +00:00
printf("Missing closing brackets: ");
2024-10-31 18:02:54 +00:00
while (!jePrazdny(&z)) {
char nezodpovedajuca = vyber(&z);
2024-10-31 18:05:16 +00:00
printf("%c",
2024-10-31 18:02:54 +00:00
(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
}