bracket_check.c

Download
c 189 lines 4.8 KB
  1// bracket_check.c
  2// μŠ€νƒμ„ μ΄μš©ν•œ κ΄„ν˜Έ 검사 ν”„λ‘œκ·Έλž¨
  3// μ—¬λŠ” κ΄„ν˜Έμ™€ λ‹«λŠ” κ΄„ν˜Έμ˜ 쌍이 μ˜¬λ°”λ₯Έμ§€ 확인
  4
  5#include <stdio.h>
  6#include <string.h>
  7#include <stdbool.h>
  8
  9#define MAX_SIZE 100
 10
 11// 문자λ₯Ό μ €μž₯ν•˜λŠ” μŠ€νƒ
 12typedef struct {
 13    char data[MAX_SIZE];
 14    int top;
 15} CharStack;
 16
 17// μŠ€νƒ μ΄ˆκΈ°ν™”
 18void stack_init(CharStack *s) {
 19    s->top = -1;
 20}
 21
 22// λΉ„μ–΄μžˆλŠ”μ§€ 확인
 23bool stack_isEmpty(CharStack *s) {
 24    return s->top == -1;
 25}
 26
 27// 가득 μ°ΌλŠ”μ§€ 확인
 28bool stack_isFull(CharStack *s) {
 29    return s->top == MAX_SIZE - 1;
 30}
 31
 32// Push
 33void stack_push(CharStack *s, char c) {
 34    if (!stack_isFull(s)) {
 35        s->data[++s->top] = c;
 36    }
 37}
 38
 39// Pop
 40char stack_pop(CharStack *s) {
 41    if (!stack_isEmpty(s)) {
 42        return s->data[s->top--];
 43    }
 44    return '\0';
 45}
 46
 47// Peek
 48char stack_peek(CharStack *s) {
 49    if (!stack_isEmpty(s)) {
 50        return s->data[s->top];
 51    }
 52    return '\0';
 53}
 54
 55// μ—¬λŠ” κ΄„ν˜ΈμΈμ§€ 확인
 56bool isOpeningBracket(char c) {
 57    return c == '(' || c == '{' || c == '[';
 58}
 59
 60// λ‹«λŠ” κ΄„ν˜ΈμΈμ§€ 확인
 61bool isClosingBracket(char c) {
 62    return c == ')' || c == '}' || c == ']';
 63}
 64
 65// κ΄„ν˜Έ 쌍이 λ§žλŠ”μ§€ 확인
 66bool isMatchingPair(char open, char close) {
 67    return (open == '(' && close == ')') ||
 68           (open == '{' && close == '}') ||
 69           (open == '[' && close == ']');
 70}
 71
 72// κ΄„ν˜Έ 검사 ν•¨μˆ˜
 73bool checkBrackets(const char *expr) {
 74    CharStack s;
 75    stack_init(&s);
 76
 77    for (int i = 0; expr[i]; i++) {
 78        char c = expr[i];
 79
 80        // μ—¬λŠ” κ΄„ν˜Έ: μŠ€νƒμ— push
 81        if (isOpeningBracket(c)) {
 82            stack_push(&s, c);
 83            printf("  [μœ„μΉ˜ %d] '%c' μ—¬λŠ” κ΄„ν˜Έ β†’ μŠ€νƒμ— push\n", i, c);
 84        }
 85        // λ‹«λŠ” κ΄„ν˜Έ: μŠ€νƒμ—μ„œ popν•˜μ—¬ 짝 확인
 86        else if (isClosingBracket(c)) {
 87            if (stack_isEmpty(&s)) {
 88                printf("  [μœ„μΉ˜ %d] '%c' 였λ₯˜ - 짝이 μ—†λŠ” λ‹«λŠ” κ΄„ν˜Έ\n", i, c);
 89                return false;
 90            }
 91
 92            char open = stack_pop(&s);
 93            if (!isMatchingPair(open, c)) {
 94                printf("  [μœ„μΉ˜ %d] 였λ₯˜ - '%c'와 '%c' 뢈일치\n", i, open, c);
 95                return false;
 96            }
 97            printf("  [μœ„μΉ˜ %d] '%c' λ‹«λŠ” κ΄„ν˜Έ β†’ '%c'와 λ§€μΉ­ OK\n", i, c, open);
 98        }
 99    }
100
101    // μŠ€νƒμ΄ λΉ„μ–΄μžˆμ§€ μ•ŠμœΌλ©΄ 짝이 λ§žμ§€ μ•ŠλŠ” μ—¬λŠ” κ΄„ν˜Έκ°€ λ‚¨μ•„μžˆμŒ
102    if (!stack_isEmpty(&s)) {
103        printf("  였λ₯˜ - λ‹«νžˆμ§€ μ•Šμ€ μ—¬λŠ” κ΄„ν˜Έκ°€ %d개 λ‚¨μ•„μžˆμŒ\n", s.top + 1);
104        return false;
105    }
106
107    return true;
108}
109
110// κ°„λ‹¨ν•œ κ΄„ν˜Έ 검사 (디버그 좜λ ₯ μ—†μŒ)
111bool checkBracketsQuiet(const char *expr) {
112    CharStack s;
113    stack_init(&s);
114
115    for (int i = 0; expr[i]; i++) {
116        char c = expr[i];
117
118        if (isOpeningBracket(c)) {
119            stack_push(&s, c);
120        } else if (isClosingBracket(c)) {
121            if (stack_isEmpty(&s)) {
122                return false;
123            }
124            char open = stack_pop(&s);
125            if (!isMatchingPair(open, c)) {
126                return false;
127            }
128        }
129    }
130
131    return stack_isEmpty(&s);
132}
133
134// ν…ŒμŠ€νŠΈ μ½”λ“œ
135int main(void) {
136    printf("=== κ΄„ν˜Έ 검사 ν”„λ‘œκ·Έλž¨ ===\n\n");
137
138    const char *tests[] = {
139        "(a + b) * (c - d)",     // μ˜¬λ°”λ₯Έ κ΄„ν˜Έ
140        "((a + b) * c",          // λ‹«νžˆμ§€ μ•Šμ€ κ΄„ν˜Έ
141        "{[()]}",                // μ˜¬λ°”λ₯Έ 쀑첩
142        "{[(])}",                // 잘λͺ»λœ 쀑첩
143        "((()))",                // μ˜¬λ°”λ₯Έ κ΄„ν˜Έ
144        ")(",                    // 잘λͺ»λœ μˆœμ„œ
145        "{[a + (b * c)] - d}",   // μ˜¬λ°”λ₯Έ λ³΅μž‘ν•œ ν‘œν˜„μ‹
146        "((a + b)",              // ν•˜λ‚˜ λΆ€μ‘±
147        "a + b)",                // μ—¬λŠ” κ΄„ν˜Έ μ—†μŒ
148        "[]{}()"                 // μ˜¬λ°”λ₯Έ 연속
149    };
150
151    int n = sizeof(tests) / sizeof(tests[0]);
152
153    for (int i = 0; i < n; i++) {
154        printf("ν…ŒμŠ€νŠΈ %d: \"%s\"\n", i + 1, tests[i]);
155
156        if (checkBrackets(tests[i])) {
157            printf("βœ“ κ²°κ³Ό: μ˜¬λ°”λ₯Έ κ΄„ν˜Έ\n");
158        } else {
159            printf("βœ— κ²°κ³Ό: 잘λͺ»λœ κ΄„ν˜Έ\n");
160        }
161        printf("\n");
162    }
163
164    // μΆ”κ°€ ν…ŒμŠ€νŠΈ: μ‚¬μš©μž μž…λ ₯
165    printf("\n=== 직접 ν…ŒμŠ€νŠΈν•΄λ³΄κΈ° ===\n");
166    char input[MAX_SIZE];
167    printf("κ΄„ν˜Έλ₯Ό ν¬ν•¨ν•œ 식을 μž…λ ₯ν•˜μ„Έμš” (μ’…λ£Œ: q): ");
168
169    while (fgets(input, MAX_SIZE, stdin)) {
170        // κ°œν–‰ 문자 제거
171        input[strcspn(input, "\n")] = 0;
172
173        if (strcmp(input, "q") == 0) {
174            break;
175        }
176
177        if (checkBracketsQuiet(input)) {
178            printf("βœ“ μ˜¬λ°”λ₯Έ κ΄„ν˜Έμž…λ‹ˆλ‹€!\n");
179        } else {
180            printf("βœ— 잘λͺ»λœ κ΄„ν˜Έμž…λ‹ˆλ‹€!\n");
181        }
182
183        printf("\nλ‹€λ₯Έ 식을 μž…λ ₯ν•˜μ„Έμš” (μ’…λ£Œ: q): ");
184    }
185
186    printf("\nν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.\n");
187    return 0;
188}