usaa23/a1/program.c

71 lines
1.8 KiB
C

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#define MAX_SIZE 100
struct stack {
char data[MAX_SIZE];
int size;
} stack;
int main() {
char code[MAX_SIZE];
stack.size = 0;
fgets(code, sizeof(code), stdin);
if (code[strlen(code) - 1] == '\n') {
code[strlen(code) - 1] = '\0';
}
printf("Read: %s\n", code);
char missing_closing[MAX_SIZE];
int missing_count = 0;
for (int i = 0; code[i] != '\0'; i++) {
if (code[i] == '(' || code[i] == '[' || code[i] == '{' || code[i] == '<') {
if (stack.size < MAX_SIZE) {
stack.data[stack.size++] = code[i];
} else {
exit(0);
}
} else if (code[i] == ')' || code[i] == ']' || code[i] == '}' || code[i] == '>') {
if (stack.size == 0) {
printf("Unexpected closing bracket %c in %d\n", code[i], i);
return 0;
}
char opening = stack.data[stack.size - 1];
stack.size--;
if ((code[i] == ')' && opening != '(') ||
(code[i] == ']' && opening != '[') ||
(code[i] == '}' && opening != '{') ||
(code[i] == '>' && opening != '<')) {
printf("Crossed bracket %c in %d, expected %c\n", code[i], i, opening);
return 0;
}
}
}
while (stack.size > 0) {
char unclosed = stack.data[--stack.size];
missing_closing[missing_count++] = (unclosed == '(') ? ')' : (unclosed == '[') ? ']' : (unclosed == '{') ? '}' : '>';
if (missing_count >= MAX_SIZE) {
exit(0);
}
}
if (missing_count > 0) {
printf("Missing closing brackets: %s\n", missing_closing);
} else {
printf("All brackets OK\n");
}
return 0;
}