-
04. 스택의 응용 - 괄호 검사 문제 알고리즘Computer Science/Data Structure 2021. 4. 10. 11:29
4.4 스택의 응용
괄호 검사 문제
- 프로그램에서 사용되는 괄호에는 [, ], {, }, (, ) 등이 있다. 스택을 이용하여 올바르게 사용되었는지 스택을 활용하여 구현해보자
- 조건
- 왼쪽 괄호의 개수와 오른쪽 괄호의 개수가 동일해야한다.
- 같은 종류의 괄호에서 왼쪽 괄호는 항상 먼저 나와야한다.
- 서로 다른 종류의 왼쪽 괄호와 오른쪽 괄호 쌍은 교차하면 안된다.
- 알고리즘
- 문자열을 차례대로 조사한다
- 왼쪽 괄호를 만나면 스택에 넣고, 오른쪽 괄호를 만나면 스택에서 가장 최근의 왼쪽 괄호를 꺼내어 맞는 지 확인한다.
- 이 떄, 스택이 비어있으면 조건1, 조건2 위배
- 괄호의 짝이맞지않으면 조건3 위배
- 마지막 괄호까지 조사를 마친 후 스택에 괄호가 남아있다면 조건 1에 위배
- 구현
#include <stdio.h> #include <stdlib.h> #define MAX_STACK_SIZE 100 typedef int element; typedef struct { element data[MAX_STACK_SIZE]; int top; } StackType; // 스택 초기화 함수 void init_stack(StackType *s) { s->top = -1; // s 안에 있는 top에 -1로 초기화 } // 공백 상태 검출 int is_empty(StackType *s) { return s->top == -1; } // 스택 포화상태 검출 int is_full(StackType *s) { return s -> top == (MAX_STACK_SIZE - 1); // index는 0부터 시작하기 때문에 -1을 해준다. } // 스택 삽입 함수 void push(StackType *s, element item) { if (is_full(s)) { fprintf(stderr, "스택이 포화상태입니다. "); return; } else s->data[++(s->top)] = item; // 먼저 스택의 top을 증가시키고, 그 데이터에 아이템을 넣겠다. -> 스택은 위로 쌓아올리는 구조이기 때문에 } // 스택 삭제 함수 element pop(StackType *s) { if (is_empty(s)) { fprintf(stderr, "스택이 비어있습니다. "); exit(1); } else return s->data[(s->top)--]; // 데이터에서 탑을 꺼낸 후 스택의 크기를 줄인다 } // 스택 피크 함수 element peek(StackType *s) { if (is_empty(s)) { fprintf(stderr, "스택이 비어있습니다. "); exit(1); } else return s->data[s->top]; // 단순히 스택에서 꺼내오는 함수 } // ========================스택 단순 구현 끝=============================== int check_matching(const char *in) { // in이라는 문자열이 변하면 안되기 때문에 const추가 StackType s; char ch, open_ch; int i, n = strlen(s); init_stack(&s); // 스택의 초기화 for (int i = 0; i < n; i++) { ch = in[i]; // 현재 검사 하고 있는 문자 switch (ch) { case '(': case '[': case '{': // 여는 괄호면 push push(&s, ch); break; case ')': case ']': case '}': // 닫는 괄호면 pop if(is_empty(&s)) return 0; // 짝이 안맞음 else { open_ch = pop(&s); if(open_ch == '(' && ch != ')' || open_ch == '{' && ch != '}' || open_ch == '[' && ch != ']') { // open_ch 와 ch 가 짝이 맞지 않을 경우 return 0; } break; } } } if (!is_empty(&s)) return 0; // 공벡 상태가 아닐 경우도 오류 return 1;// 결국 짝이 맞는 애들만 여기까지 온다. }
'Computer Science > Data Structure' 카테고리의 다른 글
04. 스택 (0) 2021.04.10 03. 배열, 구조체, 포인터 (0) 2021.04.05 02. 순환 (0) 2021.03.24 01. 자료구조와 알고리즘 (0) 2021.03.21