diff --git a/a1/prog b/a1/prog index 521b61e..d3fd74c 100755 Binary files a/a1/prog and b/a1/prog differ diff --git a/a1/program.c b/a1/program.c index 89ffff5..692c25f 100644 --- a/a1/program.c +++ b/a1/program.c @@ -4,99 +4,68 @@ #define MAX_SIZE 1000 -int is_valid_brackets(const char* s, int* err) { - char stack[MAX_SIZE]; - int top = -1; - - for (int i = 0; s[i] != '\0'; i++) { - char c = s[i]; - if (c == '(' || c == '[' || c == '{' || c == '<') { - if (top < MAX_SIZE - 1) { - stack[++top] = c; - } else { - *err = i +1; - return 0; - } - } - else if (c == ')' || c == ']' || c == '}' || c == '>') { - if (top == -1) { - *err = i +1; - return 0; - } - char last = stack[top--]; - if ((c == ')' && last != '(') || - (c == ']' && last != '[') || - (c == '}' && last != '{') || - (c == '>' && last != '<')) { - *err = i+1; - return 0; - } - } - } - if (top != -1) { - // Знаходимо позицію незакритої дужки - char lastOpen = stack[top]; - for (int i = 0; s[i] != '\0'; i++) { - if (s[i] == lastOpen) { - *err = i +1; - return 0; - } - } - } - return 1; -} - - char getExpectedClosing(char open) { switch (open) { case '(': return ')'; case '[': return ']'; case '{': return '}'; case '<': return '>'; - default: return '?'; + default: return '?'; } } + +bool isOpening(char c) { + return c == '(' || c == '[' || c == '{' || c == '<'; +} + +bool isClosing(char c) { + return c == ')' || c == ']' || c == '}' || c == '>'; +} + +char getExpectedOpening(char close) { + switch (close) { + case ')': return '('; + case ']': return '['; + case '}': return '{'; + case '>': return '<'; + default: return '?'; + } +} + int main() { char input[MAX_SIZE]; - if (fgets(input, MAX_SIZE, stdin) != NULL) { input[strcspn(input, "\n")] = '\0'; printf("Read: %s\n", input); - int err = 0; - if (is_valid_brackets(input, &err)) { - printf("All brackets OK\n"); + char stack[MAX_SIZE]; + int top = -1; + + for (int i = 0; input[i] != '\0'; i++) { + char c = input[i]; + if (isOpening(c)) { + stack[++top] = c; + } else if (isClosing(c)) { + if (top == -1) { + printf("Unexpected closing bracket %c in %d\n", c, i); + return 0; + } + char last = stack[top--]; + if (getExpectedClosing(last) != c) { + printf("Crossed bracket %c in %d, expected %c \n", c, i , getExpectedClosing(last)); + return 0; + } + } + } + + if (top != -1) { + printf("Missing closing brackets: "); + for (int i = top; i >= 0; i--) { + printf("%c", getExpectedClosing(stack[i])); + } + printf("\n"); } else { - char stack[MAX_SIZE]; - int top = -1; - - for (int i = 0; i < err; i++) { - char c = input[i]; - if (c == '(' || c == '[' || c == '{' || c == '<') { - stack[++top] = c; - } else if (c == ')' || c == ']' || c == '}' || c == '>') { - if (top >= 0 && c == getExpectedClosing(stack[top])) { - top--; - } else { - printf("Crossed bracket %c in %d, expected %c\n", - c, err, (top >= 0) ? getExpectedClosing(stack[top]) : '?'); - return 0; - } - } - } - - char c = input[err - 1]; - if (c == ')' || c == ']' || c == '}' || c == '>') { - if (top < -1) { - printf("Unexpected closing bracket %c in %d\n", c, err); - } - } else { - printf("Missing closing brackets: "); - for (int i = top; i > -1; i--) { - printf("%c", getExpectedClosing(stack[i])); - } - printf("\n"); - } + printf("All brackets OK\n"); } } else { printf("Error reading input\n");