diff --git a/a1/program.c b/a1/program.c new file mode 100644 index 0000000..73f2b85 --- /dev/null +++ b/a1/program.c @@ -0,0 +1,63 @@ +#include +#include + +#define MAX_LEN 100 + +typedef struct { + char bracket; + int position; +} StackItem; + +int main() { + char line[MAX_LEN + 1]; + StackItem stack[MAX_LEN]; + int top = -1; + + fgets(line, sizeof(line), stdin); + + printf("Read: %s", line); + + for (int i = 0; line[i] != '\0'; i++) { + char ch = line[i]; + + if (ch == '(' || ch == '{' || ch == '[' || ch == '<') { + if (top < MAX_LEN - 1) { + stack[++top].bracket = ch; + stack[top].position = i; + } + } + else if (ch == ')' || ch == '}' || ch == ']' || ch == '>') { + if (top == -1) { + + return 0; + } + + char opening = stack[top].bracket; + int opening_pos = stack[top].position; + top--; + + if ((opening == '(' && ch != ')') || + (opening == '{' && ch != '}') || + (opening == '[' && ch != ']') || + (opening == '<' && ch != '>')) { + char expected; + switch (opening) { + case '(': expected = ')'; break; + case '{': expected = '}'; break; + case '[': expected = ']'; break; + case '<': expected = '>'; break; + } + printf("Crossed bracket %c in %d, expected %c\n", ch, i, expected); + return 0; + } + } + } + + if (top != -1) { + printf("Unmatched opening bracket %c at position %d\n", stack[top].bracket, stack[top].position); + } else { + printf("All brackets OK\n"); + } + + return 0; +}