스택의 응용
괄호 검사
- 괄호의 종류 : [], {}, ()
- 조건
1.왼쪽 괄호의 개수와 오른쪽 괄호의 개수가 같아야 한다.
2.같은 괄호에서 왼쪽 괄호는 오른쪽 괄호보다 먼저 나와야 한다.
3.괄호 사이에는 포함 관계만 존재한다.
알고리즘의 개요
- 문자열에 있는 괄호를 차례대로 조사하면서 왼쪽 괄호를 만나면 스택에 삽입하고,오른쪽 괄호를 만나면 스택에서 top 괄호를 삭제한 후 오른쪽 괄호와 짝이 맞는지를 검사한다.
- 이 때, 스택이 비어 있으면 조건 1 또는 조건 2 등을 위배하게 되고 괄호의 짝이 맞지 않으면 조건 3 등에 위배된다.
- 마지막 괄호까지를 조사한 후에도 스택에 괄호가 남아 있으면 조건 1에 위배되므로 0(거짓)을 반환하고, 그렇지 않으면 1(참)을 반환한다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STACK_SIZE 100
typedef char element;
typedef struct {
element data[MAX_STACK_SIZE];
int top;
} StackType;
// 스택 초기화 함수
void init_stack(StackType* s) {
s->top = -1;
}
// 공백 상태 검출 함수
int is_empty(StackType* s) {
return (s->top == -1);
}
// 포화 상태 검출 함수
int is_full(StackType* s) {
return (s->top == (MAX_STACK_SIZE - 1));
}
// 삽입함수
void push(StackType* s, element item) {
if (is_full(s)) {
printf("스택 포화 에러\n");
return;
}
else s->data[++(s->top)] = item;
}
// 삭제함수
element pop(StackType* s) {
if (is_empty(s)) {
printf("스택 공백 에러\n");
exit(1);
}
else return s->data[(s->top)--];
}
// 피크함수
element peek(StackType* s) {
if (is_empty(s)) {
printf("스택 공백 에러\n");
exit(1);
}
else return s->data[s->top];
}
int check_matching(const char* in)
{
StackType s;
char ch, open_ch;
int i, n = strlen(in); // n= 문자열의 길이
init_stack(&s); // 스택의 초기화
for (i = 0; i < n; i++) {
ch = in[i]; // ch = 다음 문자
switch (ch) {
case '(': case '[': case '{':
push(&s, ch);
break;
case ')': case ']': case '}':
if (is_empty(&s)) return 0;
else {
open_ch = pop(&s);
if ((open_ch == '(' && ch != ')') ||
(open_ch == '[' && ch != ']') ||
(open_ch == '{' && ch != '}')) {
return 0;
}
break;
}
}
}
if (!is_empty(&s)) return 0; // 스택에 남아있으면 오류
return 1;
}
int main(void)
{
char* p = "{ A[(i+1)]=0; }";
if (check_matching(p) == 1)
printf("%s 괄호검사성공\n", p);
else
printf("%s 괄호검사실패\n", p);
return 0;
}

'자료구조' 카테고리의 다른 글
[자료구조] 덱(deque) (0) | 2022.10.19 |
---|---|
[자료구조] 큐(Queue) (0) | 2022.10.19 |
[자료구조] 스택(Stack) (0) | 2022.10.19 |
[자료구조] 배열 구조체 포인터 (0) | 2022.10.18 |
[자료구조] 순환, 히노이탑 (0) | 2022.10.18 |
댓글