기초/자료구조
[012]스택을 이용한 괄호 검사 프로그램
Yoiiin
2022. 4. 3. 01:18
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STACK_SIZE 100
/* 스택 구현 부분 */
typedef char element; //------------->char형으로 구현
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)){
fprintf(stderr, "스택 포화 에러\n");
return;
}
else s->data[++(s->top)]=item;
}
//삭제
element pop()
{
if(is_empty(s)){
fprintf(stderr, "스택 공백 에러\n");
exit(1);
}
else return s->data[(s->top)--];
}
//피크
element peek()
{
if(is_empty(s)){
fprintf(stderr, "스택 공백 에러\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);
reutrn 0;
}
* 실행결과 *
{ A[(i+1)]=0; } 괄호검사 성공
SMALL