기초/자료구조

[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