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}