문제) 스택 응용으로, 키보드로부터 입력된 한 라인의 수식 문장 내 괄호 쌍의 대칭성을 검사하는 프로그램을 작성하세요. 괄호 쌍은 { }, [ ] , ( ), 세 종류가 있다.
※ 주의: 한 개의 수식 문장은 1000개를 넘지 않는 문자로 이루어진다. 수식 문장은 공백문자를 포함할 수 있다. 검사 결과 대칭이 아니면 'Wrong_N'을, 대칭이면 'OK_N'을 출력한다. 여기서 N은 문장 내 괄호의 개수다.
(전체코드)
#include <stdio.h>
char g_stack[1001] = {0};
int g_top = -1; // 스택의 인덱스값
int g_cnt = 0; // 괄호 총 개수
int isBalanced(char* str);
void push(char bracket);
char pop();
char peek();
int main() {
char str[1001] = {0};
gets(str);
if (isBalanced(str) == 1) {
printf("OK_%d", g_cnt);
}
else {
printf("Wrong_%d", g_cnt);
}
return 0;
}
void push(char bracket) {
g_stack[++g_top] = bracket;
}
char pop() {
return g_stack[g_top--];
}
char peek() {
return g_stack[g_top];
}
int isBalanced(char* str) {
int res = 1; // True / False
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == '(' || str[i] == '{' || str[i] == '[') {
g_cnt++;
push(str[i]);
}
else if (str[i] == ')' || str[i] == '}' || str[i] == ']') {
g_cnt++;
if (str[i] == ')') {
if (peek() != '(') {
res = 0;
}
}
else if (str[i] == '}') {
if (peek() != '{') {
res = 0;
}
}
else if (str[i] == ']') {
if (peek() != '[') {
res = 0;
}
}
pop();
}
}
if (res == 0) {
return 0;
}
if (pop() == '(' || pop() == '{' || pop() == '[' || pop() == ')' || pop() == '}' || pop() == ']') {
return 0;
}
else {
return 1;
}
}
/*
입력 예시1)
(3+40*(2+(30-7)*2133)
출력 예시1)
Wrong_5
입력 예시2)
3*{4+(2-792)/1} + [3*{4-2* (100 -7)}]
출력 예시2)
OK_10
입력 예시3)
301*{4+(2101-7)/1} + 9*{4-2* (10108-7)}}
출력 예시3)
Wrong_9
입력 예시4)
(3*{4001+(2-7)/1} + [3*{4-2* (1-7)}])
출력 예시4)
OK_12
*/
참고 및 출처: 데이터 구조 원리와 응용(국형준교수님)
'Computer Science > 자료구조' 카테고리의 다른 글
[자료구조] ep5+++) 시간복잡도를 고려한 스택 설계 (1) | 2024.06.08 |
---|---|
[자료구조] ep5++) 수식표기법(스택을 이용한 후위수식) (0) | 2024.06.08 |
[자료구조] ep5) 스택(Stack) (0) | 2024.06.07 |
[자료구조] ep4+) 집합 ADT 활용문제들 (0) | 2024.05.03 |
[자료구조] ep4) 집합(Set) (0) | 2024.05.03 |